單元測試 四 隔離框架NSubstitute

2022-06-05 23:12:20 字數 1662 閱讀 5616

之前學習了單元測試的基礎知識,以及樁物件和模擬物件的不同作用。但在實際應用中,往往不會直接手寫樁物件或者模擬物件,而是使用隔離框架動態的建立這些物件,這可以讓測試變得更簡便、快捷,還可以更好地應對複雜的測試。這裡學習的便是隔離框架的一種——nsubstitute。

一 開始使用nsubstitute

在前面有乙個測試場景為:使用loganalyzer.analyze方法分析檔案,如果檔名過短,就記錄日誌,為了測試loganalyzer類與ilogger實現之間的互動,需要手寫乙個實現了ilogger介面的模擬物件,並針對這個模擬物件進行斷言。那麼現在使用nsubstitute來進行這一過程,測試**只有下面幾行就可以做到了。

logger就是使用nsubstitute建立的模擬物件。substitute靜態類動態負責建立偽物件,for 方法是產生偽物件的基本方法。最後一句中的logger.receive方法在介面中並不存在,而是被nsubstitute擴充的,用於驗證方法是否被呼叫。logger.received().logerror("filename too short:a.txt")整體的意思便是:測試logger物件是否receive對logerror方法的呼叫請求,而且傳遞的引數為"filename too short:a.txt"。這是對模擬物件的測試方法。

二 設定偽物件的返回值

還可以設定方法在一定條件下的返回值

a) 全匹配

rule.isvalidlogfilename("a.txt").returns(true),指定了當方法isvalidlogfilename()被呼叫且引數為"a.txt"時返回結果為true

b) 型別匹配

rule.isvalidlogfilename(arg.any()).returns(true),指定了當方法isvalidlogfilename()被呼叫且引數為string型別時返回結果為true,這樣匹配的範圍會更廣,這種指定方法也最常用。型別匹配主要使用arg來指定

c) 返回異常

還可以指定方法在一定的條件下返回何種異常,比如這兒的**中指定的條件為isvalidlogfilename()被呼叫且引數為string型別時,返回exception("fake exception")。這兒的寫法與前面的有點區別,用到了lambda表示式

三 使用隔離框架的注意事項

a) 隔離框架的寫法會使**可讀性降低

b) 明確要驗證的物件,不要驗證錯誤的事情,也不要過度驗證

c) 盡量少用模擬物件,乙個測試中最多出現乙個模擬物件,但模擬物件存在時,要針對模擬物件進行斷言

d) 不要使用樁物件來驗證互動,這是模擬物件做的事情

單元測試 四 隔離框架NSubstitute

之前學習了單元測試的基礎知識,以及樁物件和模擬物件的不同作用。但在實際應用中,往往不會直接手寫樁物件或者模擬物件,而是使用隔離框架動態的建立這些物件,這可以讓測試變得更簡便 快捷,還可以更好地應對複雜的測試。這裡學習的便是隔離框架的一種 nsubstitute。一 開始使用nsubstitute 在...

go Test 單元測試 測試框架

1.建立乙個名為 test.go 的檔案 如果是包中的單元測試,就在包所在目錄下建立該檔案 並將下面的 新增到其中,函式命名統一為test t testing.t package main 包中的單元測試main替換成包名 import testing func testsum t testing....

Qt單元測試框架

qtestlib 框架提供了乙個簡單易用的單元測試框架,需要在工程檔案中新增qt testlib。先看乙個簡單的例子 此外,qt還提供了以下四個會被自動呼叫的private slot inittestcase 在測試開始前被呼叫 cleanuptestcase 在測試結束後被呼叫 init 每個測試...