我在Visual Studio中有一个解决方案,下面有很多项目。这些项目中有许多是测试项目,仅包含nunit测试和与测试有关的代码。对于这些项目,我想设置一个构建后事件,该事件为每个这样的测试项目运行测试。我已经对此进行了研究,但没有发现任何问题完全可以满足我的要求,请参见下文。我已经通过nuget在Visual Studio上安装了nunit框架,并且可以从VS测试资源管理器中运行nunit测试。
这询问如何将mstest作为后期版本而不是nunit运行:Using Post-Build Event To Execute Unit Tests With MS Test in .NET 2.0+
这询问如何从VS中运行nunit,但不作为后期构建:How to run NUnit tests in Visual Studio 2017?
您需要做的第一件事是安装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"
这是一个可选的限制,我们用于将测试运行限制为单元测试的类别。您可以忽略这一点-只是为了向您展示如何根据需要限制类别。有关更多信息,请参见文档(下面的链接)。注意:类别“单元”是我们添加的我们自己的注释。这不是开箱即用的东西。因此,如果您实际上添加了此限制而不注释测试,则将不会运行任何内容!--work=$(TargetDir)\..
这会将TestResult.xml文件放入要构建的项目的DLL的父文件夹中。对于VS2019,无论如何,此目录现在是主项目文件夹下的bin文件夹。之所以使用它,是因为我们需要重定向测试输出。否则,同一解决方案中的多个项目将尝试写入同一默认文件,并且由于并发问题而失败。链接
Nunit控制台运行程序文档:https://github.com/nunit/docs/wiki/Console-Command-Line