如果您还没有 nunit.consolerunner,您需要做的第一件事是安装它。在 VS 中通过 NuGet 安装它。完成此操作后,您可以继续为每个测试项目编写构建后脚本。
幸运的是,后期构建脚本不需要因项目而异。事实上,假设 NuGet 将 nunit.consolerunner 放在预期的位置,它根本不需要改变。该脚本将在调试和发布配置中工作,因为来自 VS 的 TargetDir 和 TargetFileName 属性作为参数传递给控制台运行器。这是脚本,您只需将其粘贴到相应项目属性窗格中构建事件的构建后部分:
cd %HOMEPATH%
cd ".nuget\packages\nunit.consolerunner\3.10.0\tools"
nunit3-console.exe $(TargetDir)$(TargetFileName) --where "cat == Unit" --work=$(TargetDir)\..
其中的各个部分可以解释如下:
-
cd %HOMEPATH% 已完成,因为 nuget 通常会安装到您的用户目录中
-
cd ".nuget\packages\nunit.consolerunner\3.10.0\tools 假设 .nuget 存在于您的用户目录中,这将移动到 nuget 控制台运行程序 .exe 文件的位置
-
nunit3-console.exe 这是运行测试的 exe 文件
-
$(TargetDir)$(TargetFileName) 这是包含测试的 DLL 的完整路径,使用属性窗口中的 VS 变量创建
-
--where "cat == Unit" 这是一个可选限制,我们用于将测试运行限制为单元测试类别。您可以省略它 - 它只是向您展示如何根据需要限制类别。有关更多信息,请参阅文档(下面的链接)。注意:类别“Unit”是我们自己添加的注释。这不是开箱即用的东西。因此,如果您在没有注释测试的情况下实际添加此限制,则不会运行!
-
--work=$(TargetDir)\.. 这会将 TestResult.xml 文件放在您正在构建的项目的 DLL 的父文件夹中。对于VS2019,目前反正这个目录就是主项目文件夹下的bin文件夹。我们使用它是因为我们需要重定向测试输出。否则,同一解决方案中的多个项目会尝试写入同一默认文件,但由于并发问题而失败。
链接
Nunit 控制台运行程序文档:https://github.com/nunit/docs/wiki/Console-Command-Line
更新:一种不那么烦人的方式
上面的内容很烦人,因为如果你的任何测试失败,然后你尝试从 VS 的集成测试运行器运行它们,你就不能,因为你最终陷入了一个恶性循环:运行测试开始了构建,这会启动控制台上的测试,这些测试失败,这会导致您在 VS 中的测试无法运行。因此,为了调试,您必须四处寻找results.XML 文件。呃。
更好的方法是执行以下操作:
- 新建一个项目(我称之为TestMaster)
- 让这个项目依赖于你关心的所有其他项目
- 添加一个构建后脚本,该脚本调用所有测试项目的所有 nunit 测试
我们有五个测试项目。假设它们被称为 TestProject1、TestProject2 等。那么这个批处理文件将用作构建后脚本,如果它放在主解决方案目录的任何子目录中。它假定您已安装 Nuget v3.11.1。如果没有,只需将其更改为您拥有的任何版本:
@echo off
rem Debug or release
set CONFIG=%1
set HOMEPATH=%2
cd ../
echo Running unit tests for soln. in root dir %cd%
set currentTest=TestProject1
call :RUN_TESTS_FOR_PROJECT
set currentTest=TestProject2
call :RUN_TESTS_FOR_PROJECT
set currentTest=TestProject3
call :RUN_TESTS_FOR_PROJECT
set currentTest=TestProject4
call :RUN_TESTS_FOR_PROJECT
set currentTest=TestProject5
call :RUN_TESTS_FOR_PROJECT
echo Finished running tests
goto :EOF
:RUN_TESTS_FOR_PROJECT
cd %currentTest%
cd bin/%CONFIG%
echo --- Running tests in directory %cd%
set targetDir=%cd%
cd %HOMEPATH%
cd ".nuget\packages\nunit.consolerunner\3.11.1\tools"
set targetFileName=%currentTest%.dll
nunit3-console.exe %targetDir%\%targetFileName% --where "cat == Unit" --work=%targetDir%\..
if errorlevel 1 (
echo Tests Failed for %currentTest%
echo Exiting test run early
exit %errorlevel%
)
cd %targetDir%
cd ../../../
goto :EOF
:EOF
假设您将上述脚本放在名为 Util 的文件夹中。您的 TestMaster 项目的构建后脚本是:
cd $(SolutionDir)
cd Util
RunTests $(ConfigurationName) %HOMEPATH%