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

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

打开 shell 窗口。创建一个名为 unit-testing-vb-mstest 的目录,以保留该解决方案。在此新目录中,运行 创建新的解决方案。此做法便于管理类库和单元测试项目。在解决方案目录中,创建 PrimeService 目录。目前目录和文件结构如下所示:

PrimeService 作为当前目录,然后运行 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 目录 。运行 向解决方案添加类库项目。

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

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

测试项目需要其他包创建和运行单元测试。dotnet new 在前面的步骤中已添加 MSTest 和 MSTest 运行程序。现在,将 PrimeService 类库作为另一个依赖项添加到项目中。使用 dotnet add reference 命令:

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

可以在 GitHub 上的中看到整个文件。

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

  1. /unit-testing-vb-mstest
  2. unit-testing-vb-mstest.sln
  3. Source Files
  4. PrimeService.vbproj
  5. Test Source Files
  6. PrimeServiceTests.vbproj

在 unit-testing-vb-mstest 目录中执行 dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj

编写一个失败测试,使其通过,然后重复此过程。从 PrimeService.Tests 目录删除 UnitTest1.vb ,并创建一个名为 PrimeService_IsPrimeShould.VB 的新 Visual Basic 文件。添加以下代码:

测试失败。尚未创建实现。在起作用的 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-mstest 目录中,再次运行 dotnet testdotnet test 命令构建 PrimeService 项目,然后构建 PrimeService.Tests 项目。构建这两个项目后,该命令将运行此单项测试。测试通过。

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

可以不使用这两个属性创建新测试,而用来创建单个索引。此索引是测试多个小于 2(即最小的质数)的值的方法:

  1. <TestClass>
  2. Public Class PrimeService_IsPrimeShould
  3. Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
  4. <DataTestMethod>
  5. <DataRow(-1)>
  6. <DataRow(0)>
  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. <DataTestMethod>
  11. <DataRow(2)>
  12. <DataRow(3)>
  13. <DataRow(5)>
  14. <DataRow(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. <DataTestMethod>
  20. <DataRow(4)>
  21. <DataRow(6)>
  22. <DataRow(8)>
  23. <DataRow(9)>
  24. Public Sub IsPrime_NonPrimesLessThan10_ReturnFalse(value As Integer)
  25. Dim result As Boolean = _primeService.IsPrime(value)
  26. Assert.IsFalse(result, $"{value} should not be prime")
  27. End Sub
  28. End Class

运行 ,两项测试均失败。若要使所有测试通过,可以更改方法开头的 if 子句:

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