2014-12-13 270 views
3

所以我開始在我的應用程序的symfony 2中編寫功能和單元測試。我應該怎樣測試?我應該測試什麼?

我將功能與單元測試分開。功能測試僅適用於控制器,其餘單元測試。通過功能測試,我測試用戶在我的應用程序中可以使用的所有場景的HTML輸出。但它夠了嗎?我只測試響應/請求,而不是控制器中的代碼本身,沒有數據庫查詢等。

單元測試...我應該用它測試控制器嗎?另外,如何測試存儲庫?我應該測試每個查詢的輸出嗎?如果數據庫缺少記錄怎麼辦?

另外,測試在數據庫中創建的混亂如何?有沒有辦法在測試之後恢復數據庫到之前的狀態?

對不起有多個問題,但是這整個單元測試題目對我來說真的是一團糟。

非常感謝!

回答

2

讓我們分開兩個:單元測試和功能測試。

單元測試

這些測試應該測試在你的程序的最小單位:功能(這是在班SF2)。單元測試應該很快,所以它們不用數據庫或渲染任何東西就可以測試你的業務邏輯

您可以通過模仿依賴注入類中的服務來實現此目的。

功能測試

大多數Web應用程序從前端而不是後端建造的。我的意思是它有很大的樹枝模板和幾行控制器和數據庫查詢。你不能使用單元測試來測試它,但你想確保某些元素出現在瀏覽器中。

此外,您要測試一組功能。使用功能測試可以模擬手動測試的幾個步驟。例如。加載登錄頁面,然後填寫輸入,提交表單,然後可以檢查響應消息和身份驗證狀態。

但功能測試真的很貴。加載單個頁面可能需要幾秒鐘的時間,這意味着在一箇中型項目中進行一整套功能測試可能需要幾個小時!因此,您不能一起使用TDD(Test Driven Development)和功能測試。

結論

  • 單元測試+業務邏輯可以在TDD中使用,但不能完全測試整個系統和輸出。但它只能用於測試業務邏輯。
  • 功能測試+數據夾具可用於系統測試,確保元素出現在渲染頁面上並測試完整的過程,但速度非常慢!
+0

如果在'dev'或'test'環境中加載頁面需要幾秒鐘,請嘗試將緩存移至[tmpfs](http://en.wikipedia.org/wiki/Tmpfs)或移至[SSD] (http://en.wikipedia.org/wiki/Solid-state_drive),你應該觀察到明顯的差異。 – 2014-12-13 22:49:41

+0

我不明白爲什麼TDD和功能測試不兼容。您可以配置phpunit以便一次僅測試一個組,類等。因此,如果您正確配置phpunit,TDD不會花費更多時間。 – 2014-12-13 22:52:15

+0

爲了使用功能測試,您必須在每次運行一組測試時擦除數據庫。這需要時間。另一個問題恰恰是執行測試的次數。你不執行所有這些,這意味着在重構一些代碼之後,你不能確定_everything_是好的,只是它的一部分。使用單元測試你想檢查整個代碼的錯誤,因爲沒有它你不能確定你不會通過重構某些東西來破壞一些代碼。 – 2014-12-15 07:35:29

0

另外,如何測試存儲庫?我應該測試每個查詢的輸出嗎?如果數據庫缺少記錄怎麼辦?

我不知道它對你的情況是否有用,但你可以test Doctrine repositories

如果數據庫缺少記錄該怎麼辦?

另外,測試在數據庫中創建的混亂如何?有沒有辦法在測試之後恢復數據庫到之前的狀態?

您可以configure a different database for testing

應用程序/配置/ config_test.yml

doctrine: 
    # ... 
    dbal: 
     host:  localhost 
     dbname: testdb 
     user:  testdb 
     password: testdb 

Symfony2中也有fixtures,這是自動填充數據庫的一種方式。

注意:所有鏈接導致Symfony2官方文檔。

相關問題