在測試驅動開發中 如果測試寫錯了導致單元測試過不了怎麼辦?如何保證測試的正確性呢?

如題所述。當然,不只是在TDD中,在平常寫單元測試的時候怎麼保證測試的正確性呢?

我之前在google搜過一些相關的東西,晦澀難懂,請從事軟體開發的前輩們指點一下,謝謝啦~


所以測試必須簡單,能夠輕易寫對,或是看出哪裡錯了。


測試都能寫錯需要重審需求,要麼沒看明白,要麼沒有可測試性。


補充一點好了:

什麼叫對?什麼叫錯?這是通過測試來確定的,測試根本就不存在對錯。單元測試是一段程序沒錯,但是這段程序本身就是衡量對錯的標準,所以這段程序根本沒有什麼正確性。

如果我們有一個規則文檔,然後再將這個規則文檔轉變為一段測試程序,我們能否驗證測試程序與規則文檔一致?如果我們可以通過程序驗證,那麼這段程序就是規則文檔的另一種表達形式,如果驗證不了,就說明規則文檔沒有可測試性


如果是前者,那麼我們就可以用另一段程序將規則文檔轉換為測試程序。這樣,我們就發明了另一種描述規則的語言,然後做了這個語言的一個編譯器。說白了也就是說規則文檔自己變成了一段程序

如果是後者,因為不具備可測試性,所以我們不可能用程序確保規則文檔和程序一致,也就是測試程序的測試程序根本就不可能存在


所以本質上,根本就不存在一個超然的,絕對正確的東西。驗證規則(也就是測試程序)必須是絕對對的,測試本身就是確認程序滿足驗證規則(測試程序)的過程,而不是確保程序必然正確的過程

簡單來說就是,只能保證自己的程序通過測試,而不能保證自己的程序絕對是對的


最壞的情況難道不是錯的單元測試但是通過了嗎


首先要滿足可測試性 ,這是單元測試的前提。如果單元測試過於複雜,需要重構滿足可測試性。至於到底怎樣才滿足可測試性,則需要感覺和經驗積累了。


好問題!這是一個有趣的軟體科學(或軟體工程科學)問題。

在平常寫單元測試的時候怎麼保證測試的正確性呢?

保證測試程序(test cases)的正確性,目前主要還是靠人腦檢查(如邏輯分析)。

理由

程序 A - 實現某個功能的程序,通常稱為實現程序(Implementations)。

程序 B - 用來自動測試程序 A 正確性的程序,通常稱為(程序 A 的)測試程序。

理論上,任何計算機程序都可能出錯
自然包括程序 A 以及它的測試程序
B,是啊,測試程序本身也可能出錯,得不到正確的測試結果。那麼,我們似乎有理由需要再編寫一個用來自動測試測試程序 B 的正確性的測試程序 C
。然而,既然測試測試程序 B 的測試程序 C 也可能出錯,那麼我們是否還需要再編寫一個用來自動測試測試程序 B 的測試程序 C 的測試程序 D
呢?以此類推。。。這似乎是個遞歸的無底洞,令人腦洞大開。。。

然而,事實上在實踐中我們通常不需要再編寫程序 C 來測試程序 B(test cases),而主要是依靠人工檢查(如邏輯分析)來保證程序 B 的正確性。這麼做的原因,我分析主要是因為:

測試程序 B 出錯是相對於程序 A 出錯的大概率事件而言的小概率事件,或者當測試程序 B 出錯時我們比較容易發現,而開發一個用來測試測試程序 B 的測試程序 C 的代價過高,費效比不划算。

如果測試寫錯了導致單元測試過不了怎麼辦?

這種情況相對好辦。

某個單元測試過不了,那麼它旁邊都會有一個錯誤記號(如叉)。與日常的 debug 流程一樣,這時需要你去人腦排查並 debug。如果發現實現程序 A 的實際結果是對的,而測試結果為叉,那麼肯定是測試程序 B 出了問題,於是你便可以比較容易地發現 test case 本身的錯誤。

真正的難點在於另一個情況:本來錯誤的實現程序 A,由於測試程序 B 的錯誤導致判斷錯誤,讓某些 test cases 通過。由於在日常使用 JUnit 等測試工具的時候,常常是正確的結果遠多於錯誤的結果,即一大堆勾中含有少數的叉,這導致你很難發現這些隱蔽的錯誤(因為它們的標記是勾)。

前面 @Sparkle 也提到了這種情況:

最壞的情況難道不是錯的單元測試但是通過了嗎

待續。。。


首先,我覺得測試邏輯應該盡量簡單,代碼組織應該儘力簡潔,編寫測試的人員的能力應該得到保證

最後,代碼審查機制。定期對代碼進行review。


測試(工程師)寫的用例運行失敗,首先應該重新審查需求,確定不是自己理解錯誤後,檢查用例是否寫錯,如果沒有問題直接找開發(工程師)討論,看看到底是誰的鍋,個人覺得這是確保用例正確最有效率的方式。除了心細、經驗和多溝通外,實在也沒有太好的辦法。


1)功能分解的足夠細,UT難寫一定程度上說明程序本身結構存在問題
2)Mock斷言要精確,對輸入參數,調用次數,順序有明確限定
3)業務邏輯的正確性的保證沒有太好的辦法,只能在寫UT的過程中推敲邏輯的合理性。


推薦閱讀:

程序員真的不怎麼需要關心底層代碼優化嗎?
有沒有炫酷的 MAC 屏保?
時間久的壓縮文件容易出現無法解壓或者解壓錯誤等情況,有方法解決嗎?
軟體為何總能被破解?
電腦為什麼不能像電視機一樣即開即用呢?

TAG:軟體 | 軟體開發 | 編程 | 計算機 | 測試驅動開發 |