隨著軟體系統規模的日益擴大,以及應用領域的不斷拓展,對軟體系統的測試也變得更加困難和複雜,在進行人工測試的時候也比較難每次都全面完整的測試,加上有時候修改A功能,影響到B功能使其壞掉,這種人為因素,這時候使用自動化測試就會是很好克服這些問題的方式。透過測試自動化可以自動執行的一些重複但必要測試工作,也可以降低一些人為因素的疏漏。
自動化測試又分為單元測試、整合測試與端對端測試,其中單元測試為最小單位進行測試,所以這種測試的執行速度快,且撰寫難度較低,用最小限度的範圍保障方法的正確性。
.NET Core 的測試專案有三種選擇:MSTest、NUnit 及 xUnit,詳細的比較可以參考MSTest,NUnit 3,xUnit.net 2.0 比較,而本篇將選擇NUnit作為範例
首先先建立名為UnitTestSample的目錄,並在目錄底下使用 .NET CLI 建立方案檔(.sln)
dotnet new sln
接著建立名為SampleService的Class Libary專案
dotnet new classlib -o SampleService
建立完畢後把SampleService加入方案當中
dotnet sln add SampleService/SampleService.csproj
接著把SampleService中的Class1.cs更名為DemoService並加入基本的邏輯
namespace SampleService
{
public class DemoService
{
public bool IsMoreThan2(int candidate)
{
if (candidate <= 2)
{
return false;
}
return true;
}
}
}
目前的目錄結構為:
接著透過 .NET CLI 建立NUnit的測試專案
dotnet new nunit -o SampleService.Tests
並加入至方案中
dotnet sln add SampleService.Tests/SampleService.Tests.csproj
建立完之後的目錄
接著我們要在測試專案中加入SampleService的參考
dotnet add reference ../SampleService/SampleService.csproj
接著就在SampleService.Tests/UnitTest1.cs中加入測試的範例
[TestFixture]
public class Tests
{
private DemoService _demoService;
[SetUp]
public void Setup()
{
_demoService = new DemoService();
}
[Test]
public void IsMoreThan2_InputIs1_ReturnFalse()
{
var result = _demoService.IsMoreThan2(1);
Assert.IsFalse(result, "1 比 2小");
}
}
[TestFixture]
屬性代表包含單元測試的類別。[Test]
屬性表示此方法是測試方法。
透過Assert.IsFalse()
來對測試結果做驗證。
接著在測試專案底下使用 .NET CLI 來執行測試
dotnet test
假設如果一個測試方法,想要測試多種輸入範例,可以使用[TestCase]來增加測試案例
[TestCase(0)]
[TestCase(1)]
public void IsMoreThan2_ValuesLessThan2_ReturnFalse(int value)
{
var result = _demoService.IsMoreThan2(value);
Assert.IsFalse(result, $"{value} 比2小");
}
[TestCase(3)]
[TestCase(4)]
public void IsMoreThan2_ValuesMoreThan2_ReturnTrue(int value)
{
var result = _demoService.IsMoreThan2(value);
Assert.IsTrue(result, $"{value} 比2大");
}
透過不同情境的模擬,讓測試能夠因應更多可能發生的狀況。
參考文章
Unit testing in .NET Core and .NET Standard