[英]Does Python doctest remove the need for unit-tests?
我所參與的項目的開發人員認為,doctests與單元測試一樣好,並且如果一段代碼被證明,則不需要進行單元測試。 我不相信這是事實。 任何人都可以提供一些可靠的,理想上引用的例子來支持或反對doctests取代單元測試需求的論點嗎?
謝謝-Daniel
編輯:任何人都可以提供一個參考,表明doctesting不應該取代單元測試?
我(ab)使用doctest
代替unittest
,當我多年前開始我的gmpy項目時 - 你可以瀏覽它的源代碼並看到所有功能都經過doctests的徹底測試(功能由C編碼的Python擴展提供) ,上次我為覆蓋測量進行了檢測,我的覆蓋率超過了95%)。 我為什么這樣做? 因為doctest
是全新的,就像gmpy
,我gmpy
知道我能推動多遠。
答:確實非常 - 但絕對不值得(新奇感消失,但你不想重寫所有的測試,這就是為什么gmpy的測試仍然是全文測試的原因)。 醫生的極端脆弱性,即使在信息中最微小的拼寫錯誤也會破壞測試,當他們被這種方式濫用時,真的很麻煩。 這有點像傳統的集成測試,基於比較輸出和“黃金”(已知良好)的預期輸出:第一次容易寫,但在幾年修復無償測試中斷后你會悠閑地懺悔; - )。
如果您發現unittest
的風格繁重,但是也有一些仍然意味着用於單元測試等優良替代品,如py.test和鼻子 - doctest
的真正含義用於不同的目的(支持文檔,而不是普通的單元測試)雖然它當然值得為你的測試電池添加你為文檔目的編寫的任何doctests,但是用它替換單元測試的測試維護難題是不值得的。
確實沒有支持或反對doc測試的論據。 它們只是測試。 事實上,從python 2.4開始,有一種方法可以從你的doctests創建單元測試服: http ://docs.python.org/library/doctest.html#unittest-api
從某種意義上說,你可以將doc-tests視為單元測試的一個子集,至少從功能的角度來看。
但是python文檔建議使用doctests來實現以下目的:
他們的論點是,如果你在文檔中編寫測試,你將被迫編寫更好的文檔和測試。 與單獨編寫單元測試相反 - 您很少添加足夠的文檔,並且它們往往會停滯不前並且過時。
請參閱: http : //docs.python.org/library/doctest.html#soapbox
我認為doctests更難為集成測試這樣的事情寫作。 但是,正如您在python和Django上看到的那樣 - 他們廣泛使用doctests,從而產生更易理解的文檔和教程。
這一切都取決於你的項目。 沒有“正確”的方法來測試。
另外,我建議您查看Code Complete 2本書,因為您可能會發現單元測試不是確保您的軟件無故障的最佳方法。
Python標准庫中有一個具體的例子,說服我單獨的doctests並不總是足夠的,即decimal
模塊。 它有超過60000個單獨的測試用例(在Lib / test / decimaltestdata中); 如果所有這些都被重寫為doctests,十進制模塊確實會變得非常笨拙。 測試數量可能會減少,同時仍能提供良好的覆蓋率,但許多數值算法都非常復雜, 需要大量的單獨測試才能涵蓋所有可能的分支組合。
doctests非常適合某些用途
不同情況下的單元測試更好:
換句話說,至少對我自己來說,當你專注於解釋你正在做的事情(文檔,還有設計階段)時,doctests很棒,但當你打算將測試用作重構或代碼的安全帶時,更多的負擔覆蓋。
我認為這是考慮doctests的錯誤方式。 Doctests是文檔。 它們補充了常規單元測試。 將doctests視為恰好經過測試的文檔示例。 應該在那里用doctests來說明人類用戶的功能。 單元測試應該測試所有代碼,甚至是極端情況。 如果您為角落案例或幾十個doctests添加doctests,那么這將使您的文檔字符串難以閱讀。
可以使用doctests實現完整的單元測試套件。 但是,doctests有點受限,通常最好保留簡單的文檔示例,並使用更強大的單元測試框架(例如unittest
)進行真實詳細的單元測試。
unittest
另一個優點是測試框架對於來自使用JUnit,NUnit或類似的不同開發環境的人來說是熟悉的。 doctest
模塊略有不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.