簡體   English   中英

Python doctest是否消除了對單元測試的需求?

[英]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非常適合某些用途

  • 工作和最新的文件
  • 樣本測試嵌入在docstrings中
  • 當類API不是很清楚時,峰值或設計階段

不同情況下的單元測試更好:

  • 當你需要清晰而有些復雜的設置/拆卸時
  • 當試圖更好地覆蓋所有案例時,包括角落案件
  • 保持測試彼此獨立

換句話說,至少對我自己來說,當你專注於解釋你正在做的事情(文檔,還有設計階段)時,doctests很棒,但當你打算將測試用作重構或代碼的安全帶時,更多的負擔覆蓋。

我認為這是考慮doctests的錯誤方式。 Doctests是文檔。 它們補充了常規單元測試。 將doctests視為恰好經過測試的文檔示例。 應該在那里用doctests來說明人類用戶的功能。 單元測試應該測試所有代碼,甚至是極端情況。 如果您為角落案例或幾十個doctests添加doctests,那么這將使您的文檔字符串難以閱讀。

可以使用doctests實現完整的單元測試套件。 但是,doctests有點受限,通常最好保留簡單的文檔示例,並使用更強大的單元測試框架(例如unittest )進行真實詳細的單元測試。

unittest另一個優點是測試框架對於來自使用JUnit,NUnit或類似的不同開發環境的人來說是熟悉的。 doctest模塊略有不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM