攜程大牛的單元測試是怎麼樣寫的?

2022-07-08 03:03:10 字數 1788 閱讀 3987

大家都知道,開發軟體的時候為**編寫單元測試是很好的。但實際上,光有測試還不夠,還要編寫好的測試,這同樣重要。

要做到這一點,考慮遵循一些固執的原則,對測試**給予一些關愛:

要做到這一點,應該要進行毫不留情的重構,就像對生產**應該做的那樣。否則讓測試**隨著時間腐化,就是在測試裡面製造可怕的遺留**。如果測試不能很容易重構,那麼生產**也很難重構,從而導致生產系統的遺留**。始終做乙個勇敢的重構者。

舉個例子,測試**使用正規表示式生成內容,而這個正規表示式是跟生產**的解析器中使用的一模一樣的。

一般來說,我們不希望在測試和**之間複製邏輯。因此,在測試中複製正規表示式或其他內容不是一種選擇。在這種情況下,考慮測試輸入激勵/輸出結果之間的關係(f(輸入) - >輸出)可能會有幫助,例如,如果**的目標是要做模板替換,不要在測試**裡用原始值來做替換。相反,在測試裡面直接指定預期的計算結果。

// 使用

assertions.assertthat(processtemplate("param1", "param2")).isequalto("this is 'param1', and this is 'param2'"));

// 而不要用

assertions.assertthat(processtemplate("param1", "param2")).isequalto("this is '%s', and this is '%s'", param1, param2));

複製**

通常,要做到這一點,最好的辦法試採用測試驅動開發(test driven development)。通過tdd,人們可以在設計時識別可能會出錯的部分。不要羞於為一段小**編寫乙個簡單的測試用例。你永遠不知道什麼時候,為什麼以及以什麼方式,你會要用到甚至修改這段**。

可以研究一下如何檢查測試的有效性,類似pit這樣的工具可以進行變更測試,值得研究一下。

這不是乙個硬界限,但越過這條線很可能會產生反作用力!

tdd是關於設計的,也是關於測試的,兩者一樣重要,在模擬外部api時,測試不能用於驅動設計,api屬於第三方;這個第三方可以,並且實際上也經常會更改api的簽名和行為。

想象一下mock第三方lib的**。在第三方庫的某次公升級之後,它的邏輯可能會改變,但測試套件仍會執行得很好,因為它被mock了。所以後來,你認為一切都很好,畢竟構建牆是綠色的,軟體部署上去,然後......嘣

如果你感覺需要mock第三方庫,可能表明你當前的設計與第三方庫沒有足夠的分離。

另乙個問題是第三方庫可能很複雜,需要大量的mock才能正常工作。這導致過度指定的測試和複雜的測試輔助裝置,這本身就損害了緊湊和可讀的目標。或者由於模擬外部系統過於複雜,從而導致測試**對生產**的覆蓋不足。

取而代之的最常見的方法,是圍繞外部lib / 系統建立包裝器,儘管應該意識到抽象洩漏的風險,其中過多的低階api,概念或異常超出了包裝器的邊界。為了驗證與第三方庫的整合,編寫整合測試,並使它們盡可能緊湊和可讀。

如果一切都被mock,我們真的在測試生產**嗎?該不mock的時候,不要猶豫!

不要mock值物件

為什麼人們甚至想要這樣做?

因為例項化物件太痛苦了! => 不是正當理由。

如果建立新的物件太難了,那麼**可能需要一些嚴肅的重構。另一種方法是為您的值物件建立構建器 - 有一些工具,包括ide外掛程式,lombok和其他。還可以在測試類路徑中建立有意義的工廠方法。

abstract class customercreations 

}複製**

mockito專注於物件之間的相互操作,這是物件導向程式設計的核心部分。

倒底該怎麼寫DAO的單元測試?

code public void testadduserinfo throws exception code 為了避免髒資料!所以要把新插入的資料用removeuser刪除掉!當然,如果使用spring的那個帶有事務的基類。在teardown時,會回滾所有事務。removeuser這個方法可以無需要...

include是怎麼樣工作的?

大多數園友可能對 include 比較熟悉,因為我們寫c c 程式的時候都會寫的字串之一,但是它是具體怎麼工作的?或者它的原理是什麼呢?可能不太熟悉,也有可能沒有去關心過。我們只關心程式能否正確執行,或者程式怎麼實現等等一些問題。這裡筆者就為介紹下我們熟悉又不太熟悉的 include 首先我們了解下...

include是怎麼樣工作的?

大多數園友可能對 include 比較熟悉,因為我們寫c c 程式的時候都會寫的字串之一,但是它是具體怎麼工作的?或者它的原理是什麼呢?可能不太熟悉,也有可能沒有去關心過。我們只關心程式能否正確執行,或者程式怎麼實現等等一些問題。這裡筆者就為介紹下我們熟悉又不太熟悉的 include 首先我們了解下...