什么是單元測試
單元測試是對軟件中的最小可測試單元進行檢查和驗證。對於單元測試,要保證測試粒度足夠小,才能准確定位問題。通常而言,一個單元測試是用於判斷某個特定條件(或者場景)下某個特定函數的行為。執行單元測試,是為了證明某段代碼的行為確實和開發者所期望的一致。我們在編寫測試代碼時,應該要保證代碼的自動執行,並非交互式的,保證測試用例的自動執行,不需要對測試結果進行人工驗證。
單元測試除了協助本地開發,通常還放在持續集成中。每次有代碼簽入,單元測試都會被執行。因此單元測試要保證可重復執行,不能受外界環境影響。我們在編碼設計時,可將外部依賴項通過DI容器注入。比如,我們有一個接口,依賴日志中間件,數據庫等,我們就可以通過DI注入一個內存數據庫和Mock對象來實現。
.NET Core中的測試框架
一個最基礎的單元測試
編寫一段代碼,實現一個功能:判斷一個字符串是否時長文本(約定長度大於6即為長文本)
public class UnitTestSample
{
public static bool IsStringLong(string val)
{
return val.Length > 6;
}
}
我們現在編寫一個單元測試,測試長文本
本測試用例使用xUnit
Install-Package xunit -Version 2.4.1
測試方法名建議:待測試方法名+預期結果+參數
using Xunit;
public class UnitTestSampleTest
{
[Fact]
public void IsStringLong_ReturnTrue_WithExpectedParameters()
{
// Arrange
string val = "1234567";
// Act
var actual = UnitTestSample.IsStringLong(val);
// Assert
Assert.True(actual);
}
}
如果你使用的Visual Studio
進行開發,你可以選擇開啟Live Unit Testing
當你編寫完測試代碼后,Visual Studio會自動運行測試,如下(通過測試的代碼會有一個勾):
當然,你也可以打開測試資源管理器運行測試
我們再看看上面的代碼
上面我們只對正常情況下進行了測試,如果我們傳入null值呢?對於null值,其實我們是期望返回false,我們編寫以下測試代碼
[Fact]
public void IsStringLong_ReturnTrue_WithNullParameters()
{
// Arrange
string val = null;
// Act
var actual = UnitTestSample.IsStringLong(val);
// Assert
Assert.False(actual);
}
我們發現測試未通過:
查看測試結果發現產生了一個System.NullReferenceException
異常
我們看前面編寫的功能代碼,發現return val.Length > 6
並沒有對null值進行處理,現在修改此代碼:
public static bool IsStringLong(string val)
{
return val?.Length > 6;
}
測試通過