使用 dotnet 测试和 MSTest 对 Visual Basic .NET Core 库进行单元测试
本教程逐步讲解了构建示例解决方案的交互式体验,以学习单元测试概念。 如果希望使用预构建解决方案学习本教程,请在开始前查看或下载示例代码。 有关下载说明,请参阅 示例和教程。
本文介绍如何测试 .NET Core 项目。 如果要测试 ASP.NET Core 项目,请参阅 ASP.NET Core中的
创建源项目
打开 shell 窗口。 创建名为 unit-testing-vb-mstest 的目录来保存解决方案。
在此新目录中,运行 dotnet new sln
创建新的解决方案。 通过这种做法,可以更轻松地管理类库和单元测试项目。
在解决方案目录中,创建 PrimeService 目录。 到目前为止,你有以下目录和文件结构:
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
将 PrimeService 设为当前目录,并运行 dotnet new classlib -lang VB
来创建源项目。 将 Class1.VB 重命名为 PrimeService.VB。 创建 PrimeService
类的失败实现:
Namespace Prime.Services
Public Class PrimeService
Public Function IsPrime(candidate As Integer) As Boolean
Throw New NotImplementedException("Please create a test first")
End Function
End Class
End Namespace
将目录更改回 unit-testing-vb-using-mstest 目录。 运行 dotnet sln add .\PrimeService\PrimeService.vbproj
将类库项目添加到解决方案。
创建测试项目
接下来,创建 PrimeService.Tests 目录。 以下大纲显示了目录结构:
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
将 PrimeService.Tests 目录设置为当前目录,并使用 dotnet new mstest -lang VB
创建新项目。 此命令创建一个使用 MSTest 作为测试库的测试项目。 生成的模板在 PrimeServiceTests.vbproj中配置测试运行程序:
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
<PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />
<PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
</ItemGroup>
测试项目需要其他包来创建和运行单元测试。 上一步中的 dotnet new
添加了 MSTest 和 MSTest 测试运行器。 现在,将 PrimeService
类库添加为项目的另一个依赖项。 使用 dotnet add reference
命令:
dotnet add reference ../PrimeService/PrimeService.vbproj
可以在 GitHub 上的 示例存储库 中看到整个文件。
你有以下最终解决方案布局:
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
Test Source Files
PrimeServiceTests.vbproj
在 unit-testing-vb-mstest 目录中执行 dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj
。
创建第一个测试
编写一个失败测试,使其通过,然后重复此过程。 从 PrimeService.Tests 目录中删除 UnitTest1.vb,并创建名为 PrimeService_IsPrimeShould.VB的新 Visual Basic 文件。 添加以下代码:
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Namespace PrimeService.Tests
<TestClass>
Public Class PrimeService_IsPrimeShould
Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
<TestMethod>
Sub IsPrime_InputIs1_ReturnFalse()
Dim result As Boolean = _primeService.IsPrime(1)
Assert.IsFalse(result, "1 should not be prime")
End Sub
End Class
End Namespace
<TestClass>
属性指示包含测试的类。 <TestMethod>
属性表示由测试运行程序运行的方法。 在 unit-testing-vb-mstest中,执行 dotnet test
生成测试和类库,然后运行测试。 MSTest 测试运行程序包含要运行测试的程序入口点。 dotnet test
使用已创建的单元测试项目启动测试运行程序。
测试失败。 尚未创建实现。 在起作用的 PrimeService
类中编写最简单的代码,使此测试通过:
Public Function IsPrime(candidate As Integer) As Boolean
If candidate = 1 Then
Return False
End If
Throw New NotImplementedException("Please create a test first.")
End Function
在 unit-testing-vb-mstest 目录中,再次运行 dotnet test
。 dotnet test
命令构建 PrimeService
项目,然后构建 PrimeService.Tests
项目。 生成这两个项目后,它将运行此单个测试。 测试通过。
添加更多功能
你已经通过了一个测试,现在可以编写更多测试。 质数有其他几种简单情况:0,-1。 可以将这些事例添加为具有 <TestMethod>
属性的新测试,但这很快变得繁琐。 还有其他 MSTest 属性可用于编写一套类似的测试。 可以使用 <DataRow>
属性和 <TestMethod>
属性来指定这些输入的值。
不要创建新的测试,而是应用这两个属性来创建单个理论。 理论是一种测试小于 2 的几个值的方法,这是最低质数:
<TestClass>
Public Class PrimeService_IsPrimeShould
Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
<TestMethod>
<DataRow(-1)>
<DataRow(0)>
<DataRow(1)>
Sub IsPrime_ValuesLessThan2_ReturnFalse(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsFalse(result, $"{value} should not be prime")
End Sub
<TestMethod>
<DataRow(2)>
<DataRow(3)>
<DataRow(5)>
<DataRow(7)>
Public Sub IsPrime_PrimesLessThan10_ReturnTrue(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsTrue(result, $"{value} should be prime")
End Sub
<TestMethod>
<DataRow(4)>
<DataRow(6)>
<DataRow(8)>
<DataRow(9)>
Public Sub IsPrime_NonPrimesLessThan10_ReturnFalse(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsFalse(result, $"{value} should not be prime")
End Sub
End Class
运行 dotnet test
,两项测试均失败。 若要使所有测试通过,请在方法开头更改 if
子句:
if candidate < 2
继续通过在主库中添加测试、理论和代码来进行迭代。 你将拥有已完成的测试版本和库的完整实现。
你已为该库生成了一个小库和一组单元测试。 你已构建解决方案,以便添加新包和测试是正常工作流的一部分。 你大部分时间都专注于解决应用程序的目标。