MTP 测试项目生成为可以直接运行(或调试)的可执行文件。 没有额外用于运行测试的控制台或命令。 如果出现错误,则应用退出时会使用非零退出代码,这是大多数可执行文件的典型情况。 有关已知退出代码的详细信息,请参阅 MTP 退出代码。
小窍门
可以使用命令行选项忽略特定的退出代码--ignore-exit-code。
可以使用 TestingPlatformCommandLineArguments MSBuild 属性在项目文件中设置适用于特定测试项目的命令行选项。 一个常见的使用场景是测试项目将所有测试忽略掉,这通常会导致测试会话以退出码8退出(因为测试会话运行了零个测试)。 在此方案中,可以在项目文件的PropertyGroup下添加以下内容:
<TestingPlatformCommandLineArguments>$(TestingPlatformCommandLineArguments) --ignore-exit-code 8</TestingPlatformCommandLineArguments>
使用 dotnet publish 发布测试项目并直接运行应用程序是运行测试的另一种方法。 例如,执行 ./Contoso.MyTests.exe。 在某些情况下,也可以使用 dotnet build 生成可执行文件,但可能需要考虑边缘情况,例如Native AOT。
使用 dotnet run
dotnet run 命令可用于构建和运行测试项目。 这是运行测试的最简单方法,尽管有时速度最慢。 在本地编辑和运行测试时,使用dotnet run是实用的,因为它可确保在需要时重建测试项目。
dotnet run 还将在当前文件夹中自动查找项目。
dotnet run --project Contoso.MyTests
有关 dotnet run 的详细信息,请参阅 dotnet run。
使用 dotnet exec
dotnet exec 或 dotnet 命令用于执行已生成的测试project,这是直接运行应用程序的替代方法。
dotnet exec 需要已生成的测试项目 DLL 的路径。
dotnet exec Contoso.MyTests.dll
或者
dotnet Contoso.MyTests.dll
注释
提供测试项目的可执行文件(*.exe)的路径会导致错误:
Error:
An assembly specified in the application dependencies manifest
(Contoso.MyTests.deps.json) has already been found but with a different
file extension:
package: 'Contoso.MyTests', version: '1.0.0'
path: 'Contoso.MyTests.dll'
previously found assembly: 'S:\t\Contoso.MyTests\bin\Debug\net10.0\Contoso.MyTests.exe'
有关 dotnet exec 的详细信息,请参阅 dotnet exec。
使用 dotnet test
从 .NET 10 SDK 开始,dotnet test具有专用 MTP 模式。 通过global.json选择 MTP,或在 .NET 11 或更高版本中使用DOTNET_TEST_RUNNER环境变量。 专用模式支持较新的 SDK 版本中的项目、解决方案、生成的测试模块和其他输入类型。
dotnet test --test-modules Contoso.MyTests.dll
有关运行器选择以及从 VSTest 兼容模式迁移的信息,请参阅 使用 dotnet test 进行测试。
MTP 测试可以在Visual Studio中运行(和调试),它们与测试资源管理器集成,也可以直接作为启动项目运行。
使用 Visual Studio 运行应用
MTP 测试项目构建为可执行文件,可以立即运行。 如果未提供筛选器,这会在给定可执行文件中运行所有测试。
- 定位要在解决方案资源管理器中运行的测试项目,右键单击它并选择设置为启动项目。
- 选择Debug开始不带调试(或使用CtrlF5)运行所选测试项目。
此时会弹出控制台窗口,其中显示了测试运行的执行情况和摘要。
直接在 Visual Studio 中调试应用
可以直接调试 MTP 测试项目。 除非已提供筛选器,否则要在给定可执行文件中调试所有测试,请:
- 定位要在解决方案资源管理器中运行的测试项目,右键单击它并选择设置为启动项目。
- 在要调试的测试中设置断点。
- 转到 Debug> 启动调试(或按 F5) 调试所选的测试project。
所有测试都会执行,直到到达带有断点的测试。 逐步调试测试。 完成调试后,如果未停止,则应用将继续运行所有剩余的测试。
测试资源管理器
要运行测试,请导航到“测试资源管理器”,然后选择要运行的测试。 右键选择它,然后选择运行。 与调试测试类似,请在测试资源管理器中选择测试,然后右键单击并选择“调试”。
注释
在不构建项目的情况下,自动更新测试功能不可用。
C# 扩展以及 C# 开发工具包允许在Visual Studio代码中调试/运行测试,并添加与 Visual Studio Code 的测试资源管理器的集成。
使用 Visual Studio Code 运行应用
MTP 测试项目构建为可执行文件,可以立即运行。 如果未提供筛选器,这会在给定可执行文件中运行所有测试。
- 导航到要为其运行测试的测试文件。
- 使用 Ctrl+F5 运行所选的测试project。 如果具有多个项目,弹出窗口将要求你选择要运行的一个。
此时会弹出控制台窗口,其中显示了测试运行的执行情况和摘要。
直接在 Visual Studio Code 中调试应用
MTP 测试项目构建为可执行文件,可以立即运行。 如果未提供筛选器,这会在给定可执行文件中运行所有测试。
- 导航到要为其运行测试的测试文件。
- 使用 F5 调试所选测试项目。 如果具有多个项目,弹出窗口将要求你选择要运行的一个。
当项目运行时,输出选项卡会弹出,显示测试运行的执行情况和概要。
测试资源管理器
要运行测试,请导航到“测试资源管理器”,然后选择要运行的测试。 右键选择它,然后选择运行。 与调试测试类似,请在测试资源管理器中选择测试,然后右键单击并选择“调试”。
注释
在不构建项目的情况下,自动更新测试功能不可用。
若要并行运行多个测试项目,请为解决方案调用 dotnet test 一次,而不是为每个测试可执行文件添加管道步骤。 将 MTP 测试项目添加到解决方案时,同一命令也会将其包含在内,而无需更改管道。
在 Azure Pipelines 中运行解决方案
使用 .NET 10 SDK 或更高版本和 MTP 1.7 或更高版本。 解决方案中的所有测试项目都必须支持 MTP;此模式不支持仅 VSTest 测试项目。 有关早期 SDK 版本,请参阅 使用 VSTest 模式运行 MTP 项目。
在存储库根目录中,创建一个 global.json 文件,内容如下。 如果文件已存在,请添加test部分并确保其 SDK 设置选择 .NET 10 或更高版本。
{
"test": {
"runner": "Microsoft.Testing.Platform"
}
}
对于 TRX 报表,每个测试项目都必须引用 Microsoft.Testing.Extensions.TrxReport,可以直接引用,也可以通过包含它的测试 SDK 配置或配置文件来引用。 有关详细信息,请参阅Visual Studio测试报告(TRX)。
将以下 azure-pipelines.yml 文件添加到存储库。 该示例假定 Contoso.sln 和 global.json 位于存储库根目录。 将 Contoso.sln 替换为你的解决方案的存储库相对路径。
trigger:
- main
pool:
vmImage: ubuntu-latest
steps:
- task: UseDotNet@2
displayName: Install .NET SDK
inputs:
packageType: sdk
version: 10.0.x
- task: DotNetCoreCLI@2
displayName: Run solution tests
inputs:
command: test
projects: Contoso.sln
arguments: --configuration Release --max-parallel-test-modules 4
workingDirectory: $(Build.SourcesDirectory)
publishTestResults: true
该DotNetCoreCLI@2任务为该解决方案调用一次dotnet test。 该命令将还原依赖项、生成解决方案并并行运行其 MTP 测试模块。 默认情况下,dotnet test 可同时运行最多 Environment.ProcessorCount 个模块。 此示例使用 --max-parallel-test-modules 4 将并发限制为四个模块。 调整限制以匹配代理程序的 CPU、内存和其他资源。
重要
在 projects 中选择解决方案文件,而不是项目文件模式,例如 **/*.csproj。 该任务会针对每个匹配的文件依次分别调用 dotnet test。 单个解决方案文件调用允许 dotnet test 协调其测试项目中的并行执行。
模块级别的并行度与模块中测试的并行执行不同。 若要在程序集中配置并行测试,请使用测试框架的设置。 有关 MSTest,请参阅 ParallelizeAttribute。
使用 publishTestResults: true,即使测试失败,任务也会添加 --report-trx 和 --results-directory,并将报表发布到管道运行的 测试 选项卡。 非零 dotnet test 退出代码也会导致任务和管道失败。
注释
要在 DotNetCoreCLI@2 中支持 MTP,需要任务版本 2.263.0 或更高版本。 请将 global.json 保留在任务的工作目录中,使任务和 .NET SDK 都选择 MTP。
使用脚本运行解决方案
对于没有 MTP 支持的任务版本,或者为了直接控制 CLI 命令,请使用脚本并在单独的步骤中发布 TRX 报表。 适用相同的 .NET SDK、global.json 和 TRX 扩展要求。
trigger:
- main
pool:
vmImage: ubuntu-latest
steps:
- task: UseDotNet@2
displayName: Install .NET SDK
inputs:
packageType: sdk
version: 10.0.x
- task: CmdLine@2
displayName: Run solution tests
inputs:
script: >-
dotnet test --solution Contoso.sln
--configuration Release
--max-parallel-test-modules 4
--results-directory "$(Agent.TempDirectory)"
--report-trx
workingDirectory: $(Build.SourcesDirectory)
- task: PublishTestResults@2
displayName: Publish test results
condition: succeededOrFailed()
inputs:
testResultsFormat: VSTest
testResultsFiles: '**/*.trx'
searchFolder: $(Agent.TempDirectory)
failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
succeededOrFailed() 条件项会在测试运行成功或失败后发布结果。 脚本的非零退出代码仍会导致管道失败。 为了避免报表在模块之间被覆盖,请不要为每个模块分配相同的 TRX 文件名。 有关命名和隔离选项,请参阅 报表文件名。
运行单个测试可执行文件
对于单个测试项目,在直接调用项目可执行文件之前生成或发布项目:
- task: CmdLine@2
displayName: "Run Contoso.MyTests"
inputs:
script: '.\Contoso.MyTests\bin\Debug\net10.0\Contoso.MyTests.exe'