我如何 运行 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 测试。

备注

链接

这询问如何 运行 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%