C# 8.0和.NET Core 3.0高級編程 分享筆記六:第三部分單元測試


修復代碼中的bug所要付出的代碼很昂貴。開發過程中發現錯誤的時間越早,修復成本就越低。

單元測試是在開發早期發現BUG的好方法。一些開發人員甚至遵循這樣的原則:程序員應該在編寫代碼之前創建單元測試,這成為測試驅動開發(Text-Driven Development,TDD)。

微軟提供了專用的單元測試框架,名為MSTest;但是,這里將使用第三方單元測試框架xUnit.net。

4.4.1創建需要測試的類庫

執行如下步驟:

(1)在Chapter04文件夾中創建2個名為CalculatorLib和CalculatorLibUnitTests的子文件夾,並將它們分別添加到工作區。(我因為操作失誤,從新創建了Calculator文件夾)其他步驟一樣,添加創建2個子文件夾,然后右鍵添加到工作區。

(2)導航到Terminal|new Terminal並選擇CalculatorLib。

(3)在終端窗口中輸入以下命令:

dotnet new classlib

(4)將名為Class1.cs的文件重命名為Calculator.cs。

(5)修改Calculator.cs文件以定義為Calculator類(帶有故意的錯誤吧加法寫成乘法),如果你覺得代碼比較亂Visual Studio Code下使用Ctrl+A全選,然后使用Ctrl+K和Ctrl+F組合鍵自動格式化代碼布局,如下所示:

namespace CalculatorLib;
public class Calculator
{
    public double Add(double a, double b)
    {
        return a * b;
    }
}

(6)在終端窗口中輸入以下命令:

dotnet build

(7)導航到Terminal|New Terminal並選擇CalculatorLibUnitTests。

(8)在終端窗口中輸入以下命令:

dotnet new xunit

(9)單擊名為CalculatorLibUnitTests.csproj的文件,修改配置以添加ItemGroup部分,其他包含對CalculatorLib項目的引用,如下所示:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>

    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
    <PackageReference Include="xunit" Version="2.4.1" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="coverlet.collector" Version="3.0.2">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
  </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\CalculatorLib\CalculatorLib.csproj"/>

</ItemGroup>
</Project>

(10)將文件UnitTest1.cs重命名為CalculatorUnitTests.cs

(11)在終端窗口中輸入以下命令:

dotnet build

4.4.2 編寫單元測試

好的單元測試包含如下三個部分。

  • Arrange:這部分為輸入輸出聲明和實例化變量。
  • Act:這部分執行想要測試的單元。在我們的例子中,這意味着調用要測試的方法。
  • Assert:這部分對輸出進行斷言。斷言是一種信念,如果不為真,則表示測試失敗。例如,當計算2+2時,期望結果是4。

現在我們為Calculator類編寫單元測試。

(1)打開CalculatorUnitTests.cs,將類重命名為CalculatorUnitTests,導入CalculatorLib名稱空間,然后修改CalculatorUnitTests類,使其擁有兩個測試方法,分別計算2加2以及2加3,如下所示:

using Xunit;
using System;
using CalculatorLib;
namespace CalculatorLibUnitTests;

public class CalculatorUnitTests
{
    [Fact]
    public void TestAdding2And2()
    {
        //arrange
        double a=2;
        double b=2;
        double expected=4;
        var calc=new Calculator();
        //act
    double actual=    calc.Add(a,b);
    Assert.Equal(expected,actual); 
    }

    [Fact]
    public void TestAdding2And3()
    {
    //arrange
    double a=2;
    double b=3;
    double expected=5;
    var calc=new Calculator();
    //act
    double actual=calc.Add(a,b);

    //assert
    Assert.Equal(expected,actual);
     
    }
}

4.4.3運行單元測試

(1)在CalculatorLibUnitTest項目的終端窗口中輸入以下命令:

dotnet test

(2)請注意,輸出結果表面運行了2個測試:一個測試通過,另一個測試失敗。

(3)糾正A的的方法中的乘法為加法。

(4)再次運行單元測試,你會發現BUG修復,測試通過了。

PS D:\LearningRecords\doc\C#\NetCoreWorkspace\Code\Calculator\CalculatorLibUnitTests> dotnet test
  正在確定要還原的項目…
  所有項目均是最新的,無法還原。
     at CalculatorLibUnitTests.CalculatorUnitTests.TestAdding2And3() in D:\LearningRecords\doc\C#\NetCoreWorkspace\Code\Calculator\CalculatorLibUnitTests\CalculatorUnitTests.cs:line 33
失敗!  - 失敗:     1,通過:     1,已跳過:     0,總計:     2,持續時間: 2 ms - CalculatorLibUnitTests.dll (net6.0)
PS D:\LearningRecords\doc\C#\NetCoreWorkspace\Code\Calculator\CalculatorLibUnitTests>PS D:\LearningRecords\doc\C#\NetCoreWorkspace\Code\Calculator\CalculatorLibUnitTests>PS D:\LearningRecords\doc\C#\NetCoreWorkspace\Code\Calculator\CalculatorLibUnitTests> dotnet test
  正在確定要還原的項目…  所有項目均是最新的,無法還原。
  你正在使用 .NET 的預覽版。請查看 https://aka.ms/dotnet-core-preview  CalculatorLib -> D:\LearningRecords\doc\C#\NetCoreWorkspace\Code\Calculator\CalculatorLib\bin\Debug\net6.0\CalculatorLib.dll
  CalculatorLibUnitTests -> D:\LearningRecords\doc\C#\NetCoreWorkspace\Code\Calculator\CalculatorLibUnitTests\bin\Debug\net6.0\CalculatorLibUnitTests.dllD:\LearningRecords\doc\C#\NetCoreWorkspace\Code\Calculator\CalculatorLibUnitTests\bin\Debug\net6.0\CalculatorLibUnitTests.dll (.NETCoreApp,Version=v6.0)的測試運行
Microsoft (R) 測試執行命令行工具版本 17.0.0-preview-20210817-02
版權所有 (C) Microsoft Corporation。保留所有權利。
正在啟動測試執行,請稍候...
總共 1 個測試文件與指定模式相匹配。
已通過! - 失敗:     0,通過:     2,已跳過:     0,總計:     2,持續時間: 2 ms - CalculatorLibUnitTests.dll (net6.0)PS D:\LearningRecords\doc\C#\NetCoreWorkspace\Code\Calculator\CalculatorLibUnitTests>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM