随着软件系统规模的日益扩大,以及应用领域的不断拓展,对软件系统的测试也变得更加困难和复杂,在进行人工测试的时候也比较难每次都全面完整的测试,加上有时候修改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
<<: [Day 26] - Gatsby feat. WordPress
>>: [Day-28] Node.js (google api auth)
廿一世纪的软件开发有一句名言:「最好避免犯错的方法,就是『天天犯错』」。 以前我们很喜欢「规格」,认...
今年要跟大家分享我觉得大学生必学也必须要知道的30个Excel技巧,首先我先自我介绍一下我自己。 我...
在写 C 语言时 char *week[] = { "Friday", &quo...
在谈过MLOps在广泛的定义,以及拆分成团队、技术、流程三个面向之後。想必大家也开始思考,一个好的专...
在引用资料来源的时候,除了上传csv的选项,另外一个就是BigQuery。 早在开始摸索ML之前,G...