【问题标题】:How do I Run Nunit Tests As a Post-Build Task in Visual Studio?如何在 Visual Studio 中将 Nunit 测试作为构建后任务运行?
【发布时间】:2020-01-21 14:13:37
【问题描述】:

我在 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: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?

【问题讨论】:

    标签: visual-studio nunit visual-studio-2019 post-build


    【解决方案1】:

    如果您还没有 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%
    

    【讨论】:

    • 对人们了解有用。这就是我在开发 NUnit 时的工作方式。以下是您也可以考虑的一些替代方案。
    • 备选方案 1:相同但不要更改目录。留在 proect 目标目录中,并为 nunit3-console 使用相对路径。无论哪种方式,它都可以工作,如果您有多个测试程序集,则留在目录中会更简单。
    • 备选方案 2:使用 nunitlite 使您的每个测试程序集成为可执行文件,然后您可以使用默认设置运行它。
    • 好一个查理.. 我认为这些建议作为答案会得到更多的关注,尤其是 exe 建议
    • 不想“踩”你的答案,但我会添加书签并尝试找时间添加对 exe 方法的更完整说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多