2011-11-05 26 views
2
之間的區別

如果你是在TDD迭代的中間,你怎麼知道哪些測試失敗,因爲現有的代碼是真正的不正確和失敗,因爲無論是測試本身或功能避風港尚未實施?請不要說,「你只是不在乎,因爲你必須解決這兩個問題。」我準備好移過那個心態。TDD做法:真正的失敗和未執行的功能

我編寫測試一般的做法如下:

  • 首先,我建築師測試套件的總體結構,全部或部分轉載。那就是 - 我只會寫下測試的名稱,提醒我想要實現的功能。我通常(至少在python中)只是從每個測試只有一行開始:self.fail()。通過這種方式,我可以通過列出我認爲我想要測試的每個功能 - 比如說,一次11個測試來啓用意識流。

  • 其次,我選擇一個測試,並實際編寫測試邏輯。

  • 第三,運行測試轉輪和看到11個故障 - 10,簡單地self.fail()和1這是一個真正的AssertionError。

  • 第四,我編寫了導致我的測試通過的代碼。

  • 第五,運行測試轉輪和看到1通和10級的故障。

  • 第六,我轉到步驟2

理想的情況下,而不是看到的通行證,失敗和異常處理方面的測試,我想有一個第四種可能性:NotImplemented。

這裏最好的做法是什麼?

+0

這屬於程序員.se – Ikke

+2

寫入大量的單元測試才能讓他們通過是一個巨大的TDD *反*模式 - 所以「最佳做法」是「不要這樣做」。當所有測試都通過時,很容易解釋測試結果。正如你發現的,當很多測試失敗時,解釋測試結果並不容易。 (注意:我不是Python開發人員,但是我在其他語言中完成了很多TDD。) –

+0

那麼最好的模式是什麼?思考一個功能,並在現場爲其編寫測試?如果這是唯一可接受的TDD模式,我會完全拒絕TDD。我很重視能夠以測試名稱的形式輸出大量未來的單位,然後一次一個地寫出測試內容。這是一個非常主流的方法,至少在django社區。但是,使用@expectedFailure修飾器不是AFAIK。 – jMyles

回答

4

許多TDD工具都有PENDING測試和FAILING測試的想法。我認爲unittest2也是這樣做的。

(我想你怎麼做,這是寫:

def test_this_thing(self): 
    pass 

...但是這是從內存...

[編輯:在2.7的單元測試,或unittest2,你可以標記試驗與@skip,或者@unittest.expectedFailure裝飾。See the documentation on this

+0

我想知道更多關於此。這在unittest2文檔中並不明顯。 – jMyles

+0

我已經用指向文檔的指針更新了我的答案,如何執行此操作。希望這可以幫助! – RyanWilcox

1

大多數項目將有一個層次結構(如項目 - >套餐 - >模塊 - >類),如果你可以有選擇地在任何級別的,或者運行測試的任何項目報告將詳細介紹這些部件可以看到狀態很清楚。大多數情況下,當整個軟件包或類失敗時,這是因爲它尚未實現。

此外,在許多測試框架可以通過從除去註解/裝飾或重命名的方法/函數執行測試禁用單個測試用例。這樣做的缺點是沒有向您顯示實現進度,但如果您決定使用固定且特定的前綴,則可以很容易地將該信息從測試源樹中移出。儘管如此,我還是歡迎一個測試框架,除了更通用的測試用例狀態代碼(如PASS,WARNING和FAILED)之外,這個測試框架確實做出了區分,並且還有NOT_IMPLEMENTED。我想有些人可能會擁有它。

2

我用一張紙來創建一個測試表(暫存器跟蹤測試,這樣我就不會錯過它們)。我希望你不是一次寫完所有失敗的測試(因爲隨着每個紅綠重構週期的新知識的出現,這可能導致一定程度的抖動)。

要將測試標記爲TO-DO或未實施,您還可以將該測試標記爲[Ignore("PENDING")][Ignore("TODO")]的等效項。例如,NUnit會測試黃色而不是失敗。所以紅色意味着測試失敗,黃色意味着TODO。

0

我現在也意識到unittest.expectedFailure裝飾完成的功能全等我的需求。我以前一直以爲這個裝飾更適用於需要證書測試在測試運行的生產環境中可能不存在的環境條件,但在這種情況下它也是有意義的。

+0

我對這個解決方案非常滿意。除非有任何重大異議,否則我將其標記爲正確。 – jMyles