如何在Visual Studio中将Nunit测试作为生成后任务运行



我在Visual Studio中有一个解决方案,它下面有一堆项目。其中许多项目都是测试项目,只包含nunit测试和与测试相关的代码。对于这些项目,我想设置一个构建后事件,为每个这样的测试项目运行测试。我已经对此进行了研究,但没有发现任何问题——请参阅下文。我已经通过nuget在Visual Studio上安装了nunit框架,并且我已经可以在VS测试资源管理器中运行nunit测试了。

备注

  • 我为什么要这么做?好吧,我们还没有时间建立持续集成或构建服务器。我只是想要一些快速的东西,如果任何测试失败,就会导致解决方案的构建失败。特别是,我们的解决方案中有一个Wix项目是最后构建的,这取决于所有其他项目。因此,如果其中任何一个的后期构建失败,Wix构建也会失败。这就是我们想要的:除非所有测试都通过,否则我们不希望Wix构建MSI
  • 我已经明白了,但我想与他人分享这些知识(https://stackoverflow.blog/2011/07/01/its-ok-to-ask-and-answer-your-own-questions/)&看看是否有更好的方法
  • 在VS2019中进行了尝试和测试,但可能也适用于其他版本

链接

这询问了如何将mstest作为构建后运行,而不是nunit:在.NET 2.0+中使用构建后事件执行MS Test的单元测试

这询问了如何在VS中运行nunit,但不是作为后构建:如何在Visual Studio 2017中运行NUinit测试?

如果您还没有nunit.cosolerrunner,那么您需要做的第一件事就是安装它。通过VS中的NuGet安装它。完成后,您可以继续为每个测试项目编写一个构建后脚本。

谢天谢地,构建后的脚本不需要因项目而异。事实上,假设NuGet将nunit.conlolerunner放在预期的位置,它根本不需要改变。该脚本将在调试和发布配置中工作,因为VS中的TargetDir和TargetFileName属性将作为参数传递给控制台运行程序。这是脚本,您只需要将其粘贴到相应项目的属性窗格中的构建事件的构建后部分:

cd %HOMEPATH%
cd ".nugetpackagesnunit.consolerunner3.10.0tools"
nunit3-console.exe $(TargetDir)$(TargetFileName) --where "cat == Unit"  --work=$(TargetDir)..

这其中的各个部分可以解释如下:

  • cd %HOMEPATH%之所以完成,是因为nuget通常安装到您的用户目录中
  • cd ".nugetpackagesnunit.consolerunner3.10.0tools假设.nuget存在于用户目录中,它将移动到nuget控制台runner.exe文件的位置
  • nunit3-console.exe这是运行测试的exe文件
  • $(TargetDir)$(TargetFileName)这是包含测试的DLL的完整路径,使用属性窗口中的VS变量创建
  • --where "cat == 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 ".nugetpackagesnunit.consolerunner3.11.1tools"
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%

最新更新