单元测试 代码里面都绝对路径怎么处理_原创 | 编写单元测试和实践TDD (六)测试哪些内容:Right-BICEP...
上一章通過實例講了“第一個單元測試”到底應該怎么做,這一章我們講講“對一個工作單元需要測試它哪些方面的內容”?
有6個值得測試的部位,統稱為:Right-BICEP:
- Right——結果是否正確?
- B——是否所有的邊界條件都是正確的?
- I——能查一下反向關聯嗎?
- C——能用其他手段交叉檢查一下結果嗎?
- E——你是否可以強制錯誤條件發生?
- P——是否滿足性能要求?
1. 結果是否正確
例如對于上一節的取款案例:原有余額10000元,取款2000后,余額應該剩下8000元。我們就要測試這個結果:
assertThat(account.getBalance()).isEqualTo(8000);斷言失敗就表明實現代碼有錯,需要修改后重新測試。
2. 邊界條件
代碼中的bug往往都出現在“邊界條件”附近,也就是說,在那些條件下,代碼的行為可能不同于平常的、每天都能運行到的程序路徑。例如:
- 我們期待接受一個代表文件路徑的字符串,但客戶代碼可能傳入一個包含回車或冒號的字符串。
- 我們期待接受一個代表email的字符串,但客戶代碼可能傳入一個沒有包含“@”的字符串。
- 我們期待接受一個正數,但客戶代碼可能傳入0或負數。
- 我們期待傳入一個對象,但客戶代碼可能傳入null。
- 我們要從傳入的集合中選擇第一個元素,但客戶代碼傳入了一個空集合。
如果你是一個橋梁工程師,大橋建好之后,你不能只是在風和日麗的日子里,讓一輛車緩緩駛過橋面,就宣布大橋經過了充分測試。作為工作單元的實現者,我們的代碼交付后,代碼的用戶可能會用各種奇葩的方式調用我們的代碼,我們必須預先針對這種種可能情況預先設計應對策略,并通過單元測試來確保工作單元在各種邊界條件下都會按照我們的預設策略那樣執行。
一個想到可能的邊界條件的簡單辦法就是記住助記詞CORRECT。下一節我們將詳細論述CORRECT邊界條件。
3. 檢查反向關聯
例如我們要檢查求平方根的函數squareRoot()的正確性,就可以通過檢查平方根的平方是否等于當初的參數的當時來檢查代碼實現的正確性:
@Testvoid testSquareRootUsingInverse() {double a = 8;double result = squareRoot(a);assertThat(result * result).isCloseTo(a, Percentage.withPercentage(0.00001));}上面的測試代碼用于測試squareRoot(double a)函數的正確性。a的平方根的平方應該等于a。
說明:在計算機中浮點數無法精確比較其相等性,因此,兩個數只要足夠接近,就可以認為相等。在上面的測試例子中,我們把足夠接近定義為相差不超過0.00001%。
4. 使用其他手段來實現交叉檢查
通常而言,實現一個工作單元有一種以上的算法。我們選用其中一種最好的來作為我們的代碼實現,但可以使用其余的算法來作為單元測試。當兩者的計算結果都相同時,我們就可以認為我們的代碼實現是正確的。當然前提是兩種算法不會都是錯誤的,但恰好都產生相同的結果。
例如JDK標準庫中已經有Math.sqrt()這樣的一個平方根函數。當我們的平方根函數和標準庫中的平方根函數得出的結果相同時,就可以認為我們的的平方根函數是正確的。
@Testvoid testSquareRootUsingStd() {double a = 8;assertThat(squareRoot(a)).isCloseTo(Math.sqrt(a), Percentage.withPercentage(0.00001));}5. 強制產生錯誤條件
在真實世界中,錯誤總會發生:磁盤會滿,WIFI會斷開,程序會崩潰。你應該能夠通過主動強制引發這些錯誤,來測試你的代碼在這樣極端狀態下是如何應對這些真實世界中的問題的。
這就是使用Mockito這樣的測試替身庫的作用之一——它們能夠模擬各種各樣的異常條件,而不需要無限期地消極等待真實世界中異常狀態的出現。
6. 性能特性
一般的性能測試是黑盒測試,采用JMeter這樣的專門的性能測試工具進行測試。但是對于我們所寫的代碼,如果里面包含了復雜的循環,或者處理了大量的數據,那就應該在單元測試層面測試一下性能。
通常會有性能問題的測試都會耗時較長。我們不希望被這些測試拖慢進度。這時可以采用JUnit的測試分組策略,將這些耗時的測試分到另外的組,只在某些階段執行一下測試。而其他的單元測試會經常運行。
這一章我們講到這里,下一章將講講“CORRECT邊界條件”!
- THE END -
原創作者 | 楊宇Yangyu
編程道與術原創內容
轉載請注明“編程道與術”出處
總結
以上是生活随笔為你收集整理的单元测试 代码里面都绝对路径怎么处理_原创 | 编写单元测试和实践TDD (六)测试哪些内容:Right-BICEP...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2023 款特斯拉 Model 3 汽车
- 下一篇: python onenet_使用Pyth