本教程逐步讲解了构建示例解决方案的交互式体验,以学习单元测试概念。 如果希望使用预构建解决方案学习本教程,请在开始前查看或下载示例代码。 有关下载说明,请参阅 示例和教程。
本文介绍如何测试 .NET Core 项目。 如果要测试 ASP.NET Core 项目,请参阅 ASP.NET Core中的
先决条件
- 最新的 .NET SDK
- Visual Studio Code 编辑器
- C# 开发套件
创建源项目
打开 shell 窗口。 创建名为 unit-testing-using-nunit 的目录来保存解决方案。 在此新目录中,运行以下命令,为类库和测试项目创建新的解决方案文件:
dotnet new sln
接下来,创建 PrimeService 目录。 以下大纲显示到目前为止的目录和文件结构:
/unit-testing-using-nunit
unit-testing-using-nunit.sln
/PrimeService
将 PrimeService 设为当前目录并运行以下命令以创建源项目:
dotnet new classlib
将 Class1.cs 重命名为 PrimeService.cs。 创建 PrimeService
类的失败实现:
using System;
namespace Prime.Services
{
public class PrimeService
{
public bool IsPrime(int candidate)
{
throw new NotImplementedException("Please create a test first.");
}
}
}
将目录更改回 unit-testing-using-nunit 目录。 运行以下命令,将类库项目添加到解决方案:
dotnet sln add PrimeService/PrimeService.csproj
创建测试项目
接下来,创建 PrimeService.Tests 目录。 以下大纲显示了目录结构:
/unit-testing-using-nunit
unit-testing-using-nunit.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
将 PrimeService.Tests 目录设为当前目录,并使用以下命令创建新项目:
dotnet new nunit
dotnet new 命令创建一个使用 NUnit 作为测试库的测试项目。 生成的模板在 PrimeService.Tests.csproj 文件中配置测试运行程序:
<ItemGroup>
<PackageReference Include="nunit" Version="4.3.2" />
<PackageReference Include="NUnit3TestAdapter" Version="5.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="NUnit.Analyzers" Version="4.9.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>
注释
在 .NET 9 之前,生成的代码可以引用较旧版本的 NUnit 测试框架。 可以使用 dotnet CLI 更新包。 或者,打开 PrimeService.Tests.csproj 文件,并将包引用项组的内容替换为上面的代码。
测试项目需要其他包来创建和运行单元测试。
dotnet new
上一步中的命令添加了Microsoft测试 SDK、NUnit 测试框架和 NUnit 测试适配器。 现在,将 PrimeService
类库添加为项目的另一个依赖项。 使用 dotnet reference add
命令:
dotnet reference add ../PrimeService/PrimeService.csproj
可以在 GitHub 上的 示例存储库 中看到整个文件。
以下大纲显示了最终解决方案布局:
/unit-testing-using-nunit
unit-testing-using-nunit.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Test Source Files
PrimeService.Tests.csproj
在 unit-testing-using-nunit 目录中执行以下命令:
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
创建第一个测试
编写一个失败的测试,使其通过,然后重复该过程。 在 PrimeService.Tests 目录中,将 UnitTest1.cs 文件重命名为 PrimeService_IsPrimeShould.cs ,并将其整个内容替换为以下代码:
using NUnit.Framework;
using Prime.Services;
namespace Prime.UnitTests.Services
{
[TestFixture]
public class PrimeService_IsPrimeShould
{
private PrimeService _primeService;
[SetUp]
public void SetUp()
{
_primeService = new PrimeService();
}
[Test]
public void IsPrime_InputIs1_ReturnFalse()
{
var result = _primeService.IsPrime(1);
Assert.That(result, Is.False, "1 should not be prime");
}
}
}
该 [TestFixture]
属性表示包含单元测试的类。 该 [Test]
属性指示方法是测试方法。
保存此文件并执行 dotnet test
命令以生成测试和类库并运行测试。 NUnit 测试运行程序包含用于运行测试的程序入口点。
dotnet test
使用已创建的单元测试项目启动测试运行程序。
测试失败。 尚未创建实现。 通过在可工作的类中 PrimeService
编写最简单的代码,使测试通过:
public bool IsPrime(int candidate)
{
if (candidate == 1)
{
return false;
}
throw new NotImplementedException("Please create a test first.");
}
在 unit-testing-using-nunit 目录中,再次运行 dotnet test
。
dotnet test
命令构建 PrimeService
项目,然后构建 PrimeService.Tests
项目。 生成这两个项目后,它将运行此单一测试。 测试通过。
添加更多功能
你已经通过了一个测试,现在可以编写更多测试。 质数有其他几种简单情况:0,-1。 可以添加新测试,使用[Test]
属性,但这很快变得繁琐。 还有其他 NUnit 属性可用于编写一套类似的测试。 属性 [TestCase]
用于创建执行相同代码但具有不同输入参数的测试套件。 可以使用特性 [TestCase]
为这些输入指定值。
不要创建新测试,而是应用此属性来创建单个数据驱动测试。 数据驱动测试是一种测试小于 2 的多个值的方法,这是最低质数:
[TestCase(-1)]
[TestCase(0)]
[TestCase(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
var result = _primeService?.IsPrime(value);
Assert.That(result, Is.False, $"{value} should not be prime");
}
运行 dotnet test
,两项测试均失败。 若要使所有测试通过,可以在 PrimeService.cs 文件中更改 if
方法开头的 Main
子句:
if (candidate < 2)
继续迭代,在主库中添加更多测试、理论和代码。 你将拥有已完成的测试版本和库的完整实现。
你已为该库生成了一个小库和一组单元测试。 你还构建了解决方案,以便添加新的包和测试是标准工作流的一部分。 你大部分时间都专注于解决应用程序的目标。