修复代码中的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>