2010-12-16 60 views
4

我開始使用JavaScript的測試驅動開發,但我想在不同的項目中開始使用它。做測試驅動開發之前的注意事項

我想知道哪些典型的錯誤以及如何避免它們?

此外,我想知道我應該閱讀什麼使測試驅動開發更容易學習和適用於我的代碼。

在此先感謝。

回答

10

我使用TDD遇到的最大問題是開發人員對單元測試沒有信心。較差的單元測試會浪費更多的時間。混淆,不可信,不可維護,難以讀懂的測試很快就會落空,讓開發人員花時間想要再次自動進行單元測試。

每Fagrell提​​出了一些很好的觀點,特別是關於每次更改後運行測試;在任何測試更改之前和之後,它應該成爲第二種運行測試的性質。


框架:

考慮QUnit作爲你的JS測試框架:http://docs.jquery.com/Qunit

我已經得到了與相關標記的測試工具Page Up和測試在頁面加載運行很好。

您可以按照

  • 安排
  • 斷言

流量使用QUnit單元測試。

但是,您必須手動執行測試設置和拆卸方法,並在您的測試方法中調用它們。這些將有助於隔離測試用例,方法是保持所有測試的條件不變,並防止測試依賴於它們的運行順序。

在您將使用的其他語言中查找有用的框架。對於.NET來說,NUnit非常流行。


隔離:

每Fagrell也使得有關隔離好點。在開始測試之前,應該充分理解單元測試(測試功能原子的一個方面)和集成(測試多個原子如何一起工作)之間的區別。如果在測試方法中有多個斷言,那麼您不是單元測試,而需要更改測試方法。


約定:

從優秀The Art Of Unit Testing爲你的測試良好的命名約定是MethodUnderTest_Condition_ExpectedBehaviour例如

Expand_TextVariable_ExpandsText

the same book保持你的檢查:

  • 信得過
  • 維護的

否則,你和其他開發商不會打擾る指導測試。


僞造品:

一個常見的誤解是兩種類型的假貨之間的差:存根嘲笑

A seam在代碼中通過抽象代碼依賴於接口的功能來創建。例如。控制器不依賴於具體的存儲庫,它將取決於IRepository。

A stub然後實現這個IRepository並返回僞造值;它用於隔離控制器代碼以獨立運行。例如GetCustomer()將創建一個新客戶並返回該客戶,而不會調用實際存儲庫或任何商店。 存根不會針對進行測試。
A 模擬就像一個存根,只是它可以容納可以測試的值。例如AddCustomer(Customer customerToBeAdded),你的模擬會接受這個價值,並可以堅決反對。 Mocks可以根據進行測試。

查看一個測試隔離框架(或Mocking Framework),它可以自動爲給定接口創建假貨。

對mock目的的誤解導致我看到的不止一個開發人員創建了一個模擬測試功能,然後針對mock自己編寫測試。


資源:

我已經提到The Art Of Unit Testing和我徹底推薦它。這是其中的一本書,以及Code Complete,如果辦公室着火,我會抓住它。

希望有所幫助。

3

確保您的測試只測試一項功能。名稱和斷言應該完全與此一致。例如。如果要向可變處理程序添加expand()函數,則應該(大體上)調用test_expands_variables或should_expand_defined_variable或適用於您的命名約定的任何測試,並且斷言應該只有位於返回值或旁路值上,函數調用的效果。一個常見的錯誤是斷言設置步驟,但設置中的任何功能都應該有其自己的測試,並且確切已經存在該斷言。如果你在任何地方聲稱同樣的東西,突然很難看出你應該在哪個測試正在修復。

感受整個TDD循環的好起點是嘗試一些代碼 - 卡塔的。 Roman-numeral converter是首先編寫測試的常用第一介紹。一開始就是真的是肛門關於跑步後後面的測試每變化不大。一旦你掌握了它,你會感覺到你需要/應該如何迷戀,但爲新手準備節奏通常需要真正的迂腐。

0

我已經開始使用基於Christian Johansen的書「Test-Driven JavaScript Development」開始進入JavaScript的TDD。它非常出色,幾乎涵蓋了TDD的所有方面並將其應用於JS:http://tddjs.com/