iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0
Modern Web

我與 ASP.NET Core 的 30天系列 第 27

[Day27] 單元測試 - 我與 ASP.NET Core 3 的 30天

  • 分享至 

  • xImage
  •  

隨著軟體系統規模的日益擴大,以及應用領域的不斷拓展,對軟體系統的測試也變得更加困難和複雜,在進行人工測試的時候也比較難每次都全面完整的測試,加上有時候修改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


上一篇
[Day26] gRPC - 我與 ASP.NET Core 3 的 30天
下一篇
[Day28] 組態設定 - 我與 ASP.NET Core 3 的 30天
系列文
我與 ASP.NET Core 的 30天31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言