我如何 运行 Nunit 测试作为 Post-Visual Studio 中的构建任务?
How do I Run Nunit Tests As a Post-Build Task in Visual Studio?
我在 Visual Studio 中有一个解决方案,下面有很多项目。其中一些项目是测试项目,仅包含 nunit 测试和与测试相关的代码。对于这些项目,我想设置一个 post-build 事件,运行s 为每个这样的测试项目进行测试。我已经对此进行了研究,但还没有发现任何确切要求执行我所要求的问题 - 见下文。我已经通过 nuget 在 Visual Studio 上安装了 nunit 框架,并且我已经可以从 VS 测试资源管理器中进行 运行 nunit 测试。
备注
- 我为什么要这样做?好吧,我们还没有时间设置持续集成或构建服务器。我只是想要一些快速的东西,如果任何测试失败,解决方案的构建就会失败。特别是,我们的解决方案中有一个最后构建的 Wix 项目,这取决于所有其他项目。因此,如果其中任何一个中的 post-build 失败,则 Wix 构建将失败。这就是我们想要的:除非所有测试都通过,否则我们不希望 Wix 构建 MSI。
- 我已经解决了这个问题,但想与其他人分享知识 (https://Whosebug.blog/2011/07/01/its-ok-to-ask-and-answer-your-own-questions/) 并且看看是否有更好的方法来做到这一点。
- 已在 VS2019 中尝试和测试,但可能也适用于其他版本
链接
这询问如何 运行 mstest 作为 post-build,而不是 nunit:Using Post-Build Event To Execute Unit Tests With MS Test in .NET 2.0+
这询问如何从 VS 中 运行 nunit,但不是作为 post-build:
您需要做的第一件事是安装 nunit.consolerunner(如果您还没有)。通过 VS 中的 NuGet 安装它。完成后,您可以继续为每个测试项目编写 post-build 脚本。
幸运的是,post 构建脚本不需要因项目而异。事实上,假设 NuGet 将 nunit.consolerunner 放入预期位置,它根本不需要改变。该脚本将在调试和发布配置中工作,因为来自 VS 的 TargetDir 和 TargetFileName 属性作为参数传递到控制台 运行ner。这是脚本,您只需将其粘贴到相应项目的属性窗格中构建事件的 post-build 部分:
cd %HOMEPATH%
cd ".nuget\packages\nunit.consolerunner.10.0\tools"
nunit3-console.exe $(TargetDir)$(TargetFileName) --where "cat == Unit" --work=$(TargetDir)\..
其中各个部分可以解释如下:
cd %HOMEPATH%
已完成,因为 nuget 通常会安装到您的用户目录
cd ".nuget\packages\nunit.consolerunner.10.0\tools
假设 .nuget 存在于您的用户目录中,这将移动到 nuget 控制台的位置 运行ner .exe 文件
nunit3-console.exe
这是 运行 测试的 exe 文件
$(TargetDir)$(TargetFileName)
这是包含您的测试的 DLL 的完整路径,使用属性 window 中的 VS 变量创建
--where "cat == Unit"
这是我们用来限制我们的测试的可选限制 运行 一类单元测试。您可以省略它 - 它只是向您展示如何根据需要限制类别。有关更多信息,请参阅文档(下面的 link)。注意:类别 "Unit" 是我们自己添加的注释。这不是开箱即用的东西。因此,如果您实际上在没有注释测试的情况下添加了此限制,那么什么都不会 运行!
--work=$(TargetDir)\..
这会将 TestResult.xml 文件放入您正在构建的项目的 DLL 的父文件夹中。对于VS2019来说,反正目前这个目录就是主工程文件夹下的bin文件夹。我们使用它是因为我们需要重定向测试输出。否则,同一个解决方案中的多个项目试图写入同一个默认文件,但由于并发问题而失败。
链接
Nunit 控制台 运行ner 文档:https://github.com/nunit/docs/wiki/Console-Command-Line
更新:一种不那么烦人的方式
上面的内容很烦人,因为如果你的任何测试失败,然后你尝试从 VS 的集成测试 运行 中 运行 它们,你不能,因为你最终在一个恶性循环中:运行测试开始构建,构建开始,控制台上的测试失败,导致你在 VS 中的测试不 运行。因此,为了调试,您必须四处寻找 results.XML
文件。呃
更好的方法是执行以下操作:
- 创建一个新项目(我称之为TestMaster)
- 使该项目依赖于您关心的所有其他项目
- 添加一个 post-build 脚本,它会调用所有测试项目的所有 nunit 测试
我们有五个测试项目。假设它们被称为 TestProject1、TestProject2 等。如果将此批处理文件放在主解决方案目录的任何子目录中,则此批处理文件将用作 post-build 脚本。它假定您已安装 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.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 项目的 post-build 脚本是:
cd $(SolutionDir)
cd Util
RunTests $(ConfigurationName) %HOMEPATH%
我在 Visual Studio 中有一个解决方案,下面有很多项目。其中一些项目是测试项目,仅包含 nunit 测试和与测试相关的代码。对于这些项目,我想设置一个 post-build 事件,运行s 为每个这样的测试项目进行测试。我已经对此进行了研究,但还没有发现任何确切要求执行我所要求的问题 - 见下文。我已经通过 nuget 在 Visual Studio 上安装了 nunit 框架,并且我已经可以从 VS 测试资源管理器中进行 运行 nunit 测试。
备注
- 我为什么要这样做?好吧,我们还没有时间设置持续集成或构建服务器。我只是想要一些快速的东西,如果任何测试失败,解决方案的构建就会失败。特别是,我们的解决方案中有一个最后构建的 Wix 项目,这取决于所有其他项目。因此,如果其中任何一个中的 post-build 失败,则 Wix 构建将失败。这就是我们想要的:除非所有测试都通过,否则我们不希望 Wix 构建 MSI。
- 我已经解决了这个问题,但想与其他人分享知识 (https://Whosebug.blog/2011/07/01/its-ok-to-ask-and-answer-your-own-questions/) 并且看看是否有更好的方法来做到这一点。
- 已在 VS2019 中尝试和测试,但可能也适用于其他版本
链接
这询问如何 运行 mstest 作为 post-build,而不是 nunit:Using Post-Build Event To Execute Unit Tests With MS Test in .NET 2.0+
这询问如何从 VS 中 运行 nunit,但不是作为 post-build:
您需要做的第一件事是安装 nunit.consolerunner(如果您还没有)。通过 VS 中的 NuGet 安装它。完成后,您可以继续为每个测试项目编写 post-build 脚本。
幸运的是,post 构建脚本不需要因项目而异。事实上,假设 NuGet 将 nunit.consolerunner 放入预期位置,它根本不需要改变。该脚本将在调试和发布配置中工作,因为来自 VS 的 TargetDir 和 TargetFileName 属性作为参数传递到控制台 运行ner。这是脚本,您只需将其粘贴到相应项目的属性窗格中构建事件的 post-build 部分:
cd %HOMEPATH%
cd ".nuget\packages\nunit.consolerunner.10.0\tools"
nunit3-console.exe $(TargetDir)$(TargetFileName) --where "cat == Unit" --work=$(TargetDir)\..
其中各个部分可以解释如下:
cd %HOMEPATH%
已完成,因为 nuget 通常会安装到您的用户目录cd ".nuget\packages\nunit.consolerunner.10.0\tools
假设 .nuget 存在于您的用户目录中,这将移动到 nuget 控制台的位置 运行ner .exe 文件nunit3-console.exe
这是 运行 测试的 exe 文件$(TargetDir)$(TargetFileName)
这是包含您的测试的 DLL 的完整路径,使用属性 window 中的 VS 变量创建
--where "cat == Unit"
这是我们用来限制我们的测试的可选限制 运行 一类单元测试。您可以省略它 - 它只是向您展示如何根据需要限制类别。有关更多信息,请参阅文档(下面的 link)。注意:类别 "Unit" 是我们自己添加的注释。这不是开箱即用的东西。因此,如果您实际上在没有注释测试的情况下添加了此限制,那么什么都不会 运行!--work=$(TargetDir)\..
这会将 TestResult.xml 文件放入您正在构建的项目的 DLL 的父文件夹中。对于VS2019来说,反正目前这个目录就是主工程文件夹下的bin文件夹。我们使用它是因为我们需要重定向测试输出。否则,同一个解决方案中的多个项目试图写入同一个默认文件,但由于并发问题而失败。
链接
Nunit 控制台 运行ner 文档:https://github.com/nunit/docs/wiki/Console-Command-Line
更新:一种不那么烦人的方式
上面的内容很烦人,因为如果你的任何测试失败,然后你尝试从 VS 的集成测试 运行 中 运行 它们,你不能,因为你最终在一个恶性循环中:运行测试开始构建,构建开始,控制台上的测试失败,导致你在 VS 中的测试不 运行。因此,为了调试,您必须四处寻找 results.XML
文件。呃
更好的方法是执行以下操作:
- 创建一个新项目(我称之为TestMaster)
- 使该项目依赖于您关心的所有其他项目
- 添加一个 post-build 脚本,它会调用所有测试项目的所有 nunit 测试
我们有五个测试项目。假设它们被称为 TestProject1、TestProject2 等。如果将此批处理文件放在主解决方案目录的任何子目录中,则此批处理文件将用作 post-build 脚本。它假定您已安装 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.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 项目的 post-build 脚本是:
cd $(SolutionDir)
cd Util
RunTests $(ConfigurationName) %HOMEPATH%