[Day27] 单元测试 - 我与 ASP.NET Core 3 的 30天

随着软件系统规模的日益扩大,以及应用领域的不断拓展,对软件系统的测试也变得更加困难和复杂,在进行人工测试的时候也比较难每次都全面完整的测试,加上有时候修改A功能,影响到B功能使其坏掉,这种人为因素,这时候使用自动化测试就会是很好克服这些问题的方式。透过测试自动化可以自动执行的一些重复但必要测试工作,也可以降低一些人为因素的疏漏。
自动化测试又分为单元测试、整合测试与端对端测试,其中单元测试为最小单位进行测试,所以这种测试的执行速度快,且撰写难度较低,用最小限度的范围保障方法的正确性。

.NET Core 的测试专案有三种选择:MSTest、NUnit 及 xUnit,详细的比较可以参考MSTest,NUnit 3,xUnit.net 2.0 比较,而本篇将选择NUnit作为范例

使用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;
        }
  
    }
}

目前的目录结构为:
https://ithelp.ithome.com.tw/upload/images/20201011/20129389G0yU4HjWg6.png

接着透过 .NET CLI 建立NUnit的测试专案

dotnet new nunit -o SampleService.Tests

并加入至方案中

dotnet sln add SampleService.Tests/SampleService.Tests.csproj

建立完之後的目录
https://ithelp.ithome.com.tw/upload/images/20201011/201293895jGMr7xoDn.png

接着我们要在测试专案中加入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)

Day 28 「最好避免犯错的方法」单元测试与 GitFlow、主线开发

廿一世纪的软件开发有一句名言:「最好避免犯错的方法,就是『天天犯错』」。 以前我们很喜欢「规格」,认...

Day-1 前言&Excel介面简介

今年要跟大家分享我觉得大学生必学也必须要知道的30个Excel技巧,首先我先自我介绍一下我自己。 我...

从AWS技术白皮书看MLOps解决方案

在谈过MLOps在广泛的定义,以及拆分成团队、技术、流程三个面向之後。想必大家也开始思考,一个好的专...

BigQuery 与Machine Learning | ML#Day27

在引用资料来源的时候,除了上传csv的选项,另外一个就是BigQuery。 早在开始摸索ML之前,G...