使用 dotnet test 和 NUnit 进行 Visual Basic .NET Core 库的单元测试Unit testing Visual Basic .NET Core libraries using dotnet test and NUnit

本文内容

本教程介绍分步构建示例解决方案的交互式体验,以了解单元测试概念。如果希望使用预构建解决方案学习本教程,请在开始前查看或下载示例代码有关下载说明,请参阅示例和教程

本文介绍如何测试 .NET Core 项目。如果要测试 ASP.NET Core 项目,请参阅 ASP.NET Core 中的集成测试

系统必备Prerequisites

  • .NET Core 2.1 SDK 或更高版本。
  • 按需选择的文本编辑器或代码编辑器。

创建源项目Creating the source project

打开 shell 窗口。创建一个名为 unit-testing-vb-nunit 的目录,以保留该解决方案。在此新目录中,运行以下命令,为类库和测试项目创建新的解决方案文件:

  1. dotnet new sln

接下来,创建 PrimeService 目录。下图显示了当前的文件结构:

  1. /unit-testing-vb-nunit
  2. unit-testing-vb-nunit.sln
  3. /PrimeService

将 PrimeService 作为当前目录,并运行以下命令以创建源项目:

  1. dotnet new classlib -lang VB

将 Class1.VB 重命名为 PrimeService.VB 。创建 PrimeService 类的失败实现:

  1. Imports System
  2. Namespace Prime.Services
  3. Public Class PrimeService
  4. Public Function IsPrime(candidate As Integer) As Boolean
  5. Throw New NotImplementedException("Please create a test first.")
  6. End Function
  7. End Class
  8. End Namespace

将目录更改回 unit-testing-vb-using-mstest 目录 。运行以下命令,向解决方案添加类库项目:

  1. dotnet sln add .\PrimeService\PrimeService.vbproj

创建测试项目Creating the test project

接下来,创建 PrimeService.Tests 目录。下图显示了它的目录结构:

  1. /unit-testing-vb-nunit
  2. unit-testing-vb-nunit.sln
  3. /PrimeService
  4. Source Files
  5. PrimeService.vbproj
  6. /PrimeService.Tests

将 PrimeService.Tests 目录作为当前目录,并使用以下命令创建一个新项目:

  1. dotnet new nunit -lang VB

dotnet new 命令可创建一个将 NUnit 用作测试库的测试项目。生成的模板在 PrimeServiceTests.vbproj 文件中配置了测试运行程序:

  1. <ItemGroup>
  2. <PackageReference Include="nunit" Version="3.12.0" />
  3. <PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
  4. <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />
  5. </ItemGroup>

测试项目需要其他包创建和运行单元测试。在上一步中,dotnet new 已添加 NUnit 和 NUnit 测试适配器。现在,将 PrimeService 类库作为另一个依赖项添加到项目中。使用 dotnet add reference 命令:

  1. dotnet add reference ../PrimeService/PrimeService.vbproj

可以在 GitHub 上的示例存储库中看到整个文件。

最终的解决方案布局将如下所示:

  1. /unit-testing-vb-nunit
  2. unit-testing-vb-nunit.sln
  3. /PrimeService
  4. Source Files
  5. PrimeService.vbproj
  6. /PrimeService.Tests
  7. Test Source Files
  8. PrimeService.Tests.vbproj

在 unit-testing-vb-nunit 目录中执行以下命令:

  1. dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj

创建第一个测试Creating the first test

编写一个失败测试,使其通过,然后重复此过程。在 PrimeService.Tests 目录中,将 UnitTest1.vb 文件重命名为 PrimeService_IsPrimeShould.VB ,并将其整个内容替换为以下代码:

  1. Imports NUnit.Framework
  2. Namespace PrimeService.Tests
  3. <TestFixture>
  4. Public Class PrimeService_IsPrimeShould
  5. Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
  6. <Test>
  7. Sub IsPrime_InputIs1_ReturnFalse()
  8. Dim result As Boolean = _primeService.IsPrime(1)
  9. Assert.False(result, "1 should not be prime")
  10. End Sub
  11. End Class
  12. End Namespace

<TestFixture> 属性指示包含测试的类。<Test> 属性表示由测试运行程序运行的方法。在 unit-testing-vb-nunit 中,执行 dotnet test 以构建测试和类库,然后运行测试。NUnit 测试运行程序包含要运行测试的程序入口点。dotnet test 使用已创建的单元测试项目启动测试运行程序。

测试失败。尚未创建实现。在起作用的 PrimeService 类中编写最简单的代码,使此测试通过:

  1. Public Function IsPrime(candidate As Integer) As Boolean
  2. If candidate = 1 Then
  3. Return False
  4. End If
  5. Throw New NotImplementedException("Please create a test first.")
  6. End Function

在 unit-testing-vb-nunit 目录中,再次运行 dotnet testdotnet test 命令构建 PrimeService 项目,然后构建 PrimeService.Tests 项目。构建这两个项目后,该命令将运行此单项测试。测试通过。

添加更多功能Adding more features

你已经通过了一个测试,现在可以编写更多测试。质数有其他几种简单情况:0、-1。可以将这些情况添加为具有 <Test> 属性的新测试,但这很快就会变得枯燥乏味。还有其他 xUnit 属性,可使你编写类似测试套件。<TestCase> 属性表示执行相同代码,但具有不同输入参数一系列测试。可以使用 <TestCase> 属性来指定这些输入的值。

无需创建新测试,而是应用这两个属性来创建一系列测试,用于测试小于 2(最小质数)的几个值:

  1. <TestFixture>
  2. Public Class PrimeService_IsPrimeShould
  3. Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
  4. <TestCase(-1)>
  5. <TestCase(0)>
  6. <TestCase(1)>
  7. Sub IsPrime_ValuesLessThan2_ReturnFalse(value As Integer)
  8. Dim result As Boolean = _primeService.IsPrime(value)
  9. Assert.IsFalse(result, $"{value} should not be prime")
  10. End Sub
  11. <TestCase(2)>
  12. <TestCase(3)>
  13. <TestCase(5)>
  14. <TestCase(7)>
  15. Public Sub IsPrime_PrimesLessThan10_ReturnTrue(value As Integer)
  16. Dim result As Boolean = _primeService.IsPrime(value)
  17. Assert.IsTrue(result, $"{value} should be prime")
  18. End Sub
  19. <TestCase(4)>
  20. <TestCase(6)>
  21. <TestCase(8)>
  22. <TestCase(9)>
  23. Public Sub IsPrime_NonPrimesLessThan10_ReturnFalse(value As Integer)
  24. Dim result As Boolean = _primeService.IsPrime(value)
  25. Assert.IsFalse(result, $"{value} should not be prime")
  26. End Sub
  27. End Class

运行 dotnet test,两项测试均失败。若要使所有测试通过,可以在 PrimeServices.cs 文件中更改 Main 方法开头的 if 子句 :

  1. if candidate < 2

通过在主库中添加更多测试、理论和代码继续循环访问。你将拥有已完成的测试版本库的完整实现

你已生成一个小型库和该库的一组单元测试。你已将解决方案结构化,使添加新包和新测试成为了正常工作流的一部分。你已将多数的时间和精力集中在解决应用程序的目标上。