狹義的單元測試是測試自動化的一種,用代碼的方式測試軟件的某一個可測試的部分。
想要做好單元測試,不僅需要一個測試框架,還需要一系列的配套工具。
工具分類
實際上,做單元測試的工具和做測試自動化的工具沒有本質(zhì)區(qū)別,因此我們統(tǒng)一使用測試自動化工具的分類來進(jìn)行介紹。
X-Unit工具,最基礎(chǔ)的工具,用來定義測試用例框架和擴(kuò)展機(jī)制。功能主要有:定義用例、運(yùn)行用例、收集測試結(jié)果、對用例進(jìn)行標(biāo)記、框架擴(kuò)展。
斷言工具,簡化預(yù)期結(jié)果和實際結(jié)果的比較驗證,當(dāng)錯誤發(fā)生時收集錯誤現(xiàn)場,給出準(zhǔn)確的原因描述,最好能達(dá)到看消息就能知道錯在哪里,而不必再次運(yùn)行和調(diào)試用例。另外在簡單的字符串比較之外,還要支持多種運(yùn)算操作比較、結(jié)構(gòu)化報文比較。
造數(shù)工具,方便通過規(guī)則生成多種多樣的業(yè)務(wù)數(shù)據(jù),并且要符合邏輯性。能在框架的基礎(chǔ)上實現(xiàn)數(shù)據(jù)驅(qū)動測試。
Mock,支持打樁和模擬,避免修改源碼。
操縱測試對象的工具,如操作待測試軟件、數(shù)據(jù)庫、文件系統(tǒng)、網(wǎng)絡(luò)、系統(tǒng)時鐘等等。
xUnit
Java:目前常用Junit5,要比Junit4更簡便。如果喜歡動態(tài)編程,那么Groovy、Spock也是不錯的選擇。
CPP:Google Test、Catch2,老代碼中可能還會用CppUnit。
斷言
Java體系中有很多額外斷言工具:Hamcrest、AssertJ、Xml Unit、Json Unit等。單用Groovy編程語言也可以達(dá)到專門斷言工作的效果。
CPP:Google Test自帶的斷言。
Mock
Java:Mockito目前還在活躍,PowerMock特有的功能Mockito也在逐漸支持。
CPP:Google Mock等。
操縱測試對象
Java專用的有:
DbUnit,專門針對數(shù)據(jù)庫的測試工具,可以在測試前準(zhǔn)備好數(shù)據(jù)庫狀態(tài),在測試后清理數(shù)據(jù)庫。
System Stubs,用于測試帶有
java.lang.System相關(guān)依賴的邏輯,方便管理環(huán)境變量、系統(tǒng)屬性、標(biāo)準(zhǔn)輸入輸出等。
通用的有Test Containers、faketime。
Test Containers將常見中間件封裝成測試容器,方便啟停和配置。還有常見云服務(wù)的模擬版本,如LocalStack。
faketime用于攔截系統(tǒng)時鐘調(diào)用,方便進(jìn)行時間敏感的測試。
除了通用的工具外,每種通用軟件都會提供專門的工具方便用在測試場景中。
更高層次的工具
xUnit之外還有一些新的測試自動化工具,如Robot Framework、Cucumber、Karate等。它們脫胎于xUnit,但在此基礎(chǔ)上增加了DSL、數(shù)據(jù)驅(qū)動、行為驅(qū)動等功能,讓測試工具超出單元測試的范疇。