對於測試,其實不用顧慮那么多,隨便選擇吧,MSTest對VS的集成是最好的,而且也很容易上手,如果哪一天碰到它所無法解決的事情,切換到其他框架也非常簡單,僅僅只是Nuget下個包,換下特性而已。
測試用例組成
單元測試方法名應具有可讀性,讓整個測試方法在不需要注釋說明的情況下可以被讀懂。
<被測試方法名稱>_<期望的結果>_<給予的條件>
一個完整的單元測試用例應該包含如下三個部分:
- Arrange:准備當前測試場景的前置條件;
- Action:執行被測試方法;
- Assert:對被測試方法的執行結果進行斷言判斷。
代碼覆蓋率
代碼覆蓋率指的是運行單元測試時,產品代碼的覆蓋情況。
在測試資源管理器中,對選中的單元測試或者全部單元測試的代碼進行覆蓋率檢查。
雙擊相應方法可以看到具體的代碼覆蓋情況:紅色(未被覆蓋),米色(未覆蓋完全),淺藍色(完全覆蓋)。
對於明確要求測試的公共方法,該方法的代碼覆蓋率要求100%。
對於指定排除在覆蓋率之外的代碼,可使用[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage()]。
基於返回值測試
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass()]
public class ClassNameTests
{
[DataTestMethod]
[DataRow(1,2,3)]
[DataRow(1,20,21)]
public void AdditonMethodTest(int a , int b, int result)
{
Assert.AreEqual(result, a + b);
}
}
測試用例
基於狀態測試
無返回值的情況下,只需要驗證更改前后是否符合預期即可。
[TestClass()]
public class LeetCodesTests
{
[TestMethod()]
public void HeadTailExchangeTest()
{
// arrange
int[] nums = { 1, 2, 3, 4, 5, 6, 7 };
int[] nums2 = { 1, 7, 3, 5, 4, 6, 2 };
var lc = new LeetCodes();
// act
var rslt = lc.HeadTailExchange(nums);
// assert
Assert.IsTrue(CommFunc.Comparar<int>.CompararArray(rslt, nums2));
}
}
依賴外部對象的測試
單元測試需要能夠快速獨立運行,隔離掉對外部的依賴是非常必要的,比如文件系統、硬件數據、web服務等。可以引入“偽對象”。
流程邏輯:要對單元測試進行約束設計;提取接口,從對具體實現的依賴解耦為對接口的依賴。偽對象實現第三方方法;被測試類添加獲取偽對象;派生類注入偽對象;在單元測試時,在派生測試類中測試即可。
隔離框架,一個能夠在運行時新建和配置偽對象的可重用的類庫,它讓開發者不用為了偽對象而編寫重復的代碼。隔離框架可以替我們動態的生成需要的偽對象,節省很多精力。常用的模擬庫,比如Moq
多線程測試
ILogger測試