【问题标题】:How to install nUnit 3 nunit3-console.exe in TeamCity 9.x如何在 TeamCity 9.x 中安装 nUnit 3 nunit3-console.exe
【发布时间】:2016-02-25 20:35:28
【问题描述】:

TeamCity 9.1.x 现在支持 NUnit 3.0,但是您必须安装运行程序并在步骤中指定 nunit3.console.exe 的路径。我的问题是我在哪里复制 nunit3-console.exe?我必须把这个放在所有的代理上吗?我是否将它放在我的 TeamCity 主服务器上的目录中,它会被代理共享或拉取?似乎没有很好的文档说明将这些文件复制到何处以便所有代理都可以使用它们。

【问题讨论】:

    标签: teamcity nunit-3.0


    【解决方案1】:

    您应该在要运行 NUnit 测试的每个代理上都有 NUnit 控制台。

    最好的选择是:

    1. 添加对 NuGet 包的引用 (https://www.nuget.org/packages/NUnit.Runners/)。

    2. 要恢复包,您可以使用“NuGet Installer”构建步骤,请参阅以下博客文章:https://blog.jetbrains.com/teamcity/2013/08/nuget-package-restore-with-teamcity/

    3. 之后,您只需从还原的 NuGet 包中设置路径,如“packages\NUnit.Console.3.0.0\tools\nunit3-console.exe”。

    【讨论】:

    • 是我还是这有点可笑?我也沿着这条路走,没有看到这个答案,但让我感到震惊的是,当解决方案中的包更新时,人们会想知道为什么他们的 TC 构建失败,因为包版本名称不再是日期。
    • 我赞成这个答案,因为它告诉我有一个包含跑步者的 NuGet 包。我一直在我的构建代理上直接安装 NUnit 并引用该路径。但是,我同意@Tom 的观点,即packages 路径中的硬编码版本号不是最理想的;开发人员必须在所有构建配置中保持版本同步,这样硬编码的目录名称才能起作用。也许可以设置一个单独的构建步骤来检测正确的路径并将其分配给一个变量?
    • @NathanAldenSr 如果 TC 可以在包目录中自动检测最新的控制台运行程序,而无需指定任何内容,那就更好了。如果 TC 甚至可以从 NuGet 获取最新版本(除非您在解决方案中提供了它)并针对它运行它,那就更好了,这样开发人员在放置项目时就不需要考虑他们的构建服务器要求在一起。
    • Nunit.Runners 包现已弃用,您必须使用 NUnit.ConsoleRunner。小心不要使用听起来非常相似的其他 10 多个 nunit 包之一,即 NUnit.Console、NUnit.Runners、NUnit.Engine、NUnit.Extension.TeamCityEventListener 等。考虑到我自己的 XUnit ......这是只是为了运行一些单元测试变得有点乏味。
    • @woogy 单数 Nunit.Console 包将引入 Nunit.ConsoleRunner 和其他位,但您必须提供 Nunit.ConsoleRunner 的路径,而不仅仅是 Nunit.Console 的 exe。
    【解决方案2】:

    基于@NikolayP 的回答:

    1. 添加对 NuGet 包的引用 (https://www.nuget.org/packages/NUnit.Runners/)。
    2. 要恢复包,您可以使用“NuGet Installer”构建步骤,请参阅以下博客文章:https://blog.jetbrains.com/teamcity/2013/08/nuget-package-restore-with-teamcity/
    3. 之后,您只需从还原的 NuGet 包中设置路径,如“packages\NUnit.Console.3.0.0\tools\nunit3-console.exe”。

    我编写了以下 PowerShell 脚本来确定正确的 NUnit.ConsoleRunner 包目录并在运行 NUnit 任务之前填充 TeamCity 变量。它使用最新版本的 NUnit.Console 包。

    $SrcDirectory = "%src.directory%"
    $PackagesDirectory = Join-Path $SrcDirectory packages
    
    $NUnitConsoleRunnerPackageDirectory = Get-ChildItem (Join-Path $PackagesDirectory NUnit.ConsoleRunner.*) | %{
        @{
            Directory = $_.FullName
            Version = [Version]::Parse(($_.Name -replace "NUnit.ConsoleRunner.",""))
        }
    } | Sort-Object Version -Descending | Select-Object -First 1 | %{ $_.Directory }
    
    if (!$NUnitConsoleRunnerPackageDirectory) {
        throw [IO.DirectoryNotFoundException] "NUnit console runner package directory not found"
    }
    
    Write-Output "##teamcity[setParameter name='nunit.consolerunner.directory' value='$NUnitConsoleRunnerPackageDirectory']"
    

    请注意,您需要定义 src.directory 变量以指向包含构建代理上的 packages 目录的目录,或者提供必要的根目录以使 PowerShell 脚本正常工作。您还需要使用默认值为空来定义 nunit.consolerunner.directory 变量。

    如果由于某种原因找不到 NUnit.ConsoleRunner 目录,该脚本也会抛出异常。

    【讨论】:

    • 感谢您激励我更进一步。通常,MSBuild 项目有一个解决方案文件,您需要使用 TeamCity 中的路径指定该文件。使用这个现有的变量和Split-Path,我能够获取已经需要在项目中设置的信息并确定正确的包目录,并将 tools/nunit3-console.exe 的完整路径返回到 Nunit3Path 变量中。跨度>
    • 从 2017.1.3 开始,可以在没有版本号的目录中安装软件包(有关详细信息,请参阅我的 answer)。
    【解决方案3】:

    【讨论】:

    • 我为 NUnit3 使用了 NUnit 构建步骤,但是 TeamCity 不断将“nunit-console.exe”添加到我在“NUnit 控制台运行器路径”字段中输入的任何值中,尽管帮助说“指定” NUnit 控制台运行程序的路径,包括文件名。我最终升级到 TeamCity 9.1.6,问题似乎已经解决。我使用 Nuget 获取 NUnit Console 3.0.1 和路径值 '%teamcity.build.checkoutDir%\\packages\NUnit.Console.3.0.1\tools\nunit3-console.exe'
    【解决方案4】:

    构建正在代理上运行,因此您需要在要运行构建的所有代理上安装 NUnit3。

    【讨论】:

    • 您还必须在 TC build config 中添加 nunit 控制台的路径,例如 C:\Program Files (x86)\NUnit.org\nunit-console\nunit3-console.exe。现在这似乎很尴尬 - 如果我将下拉菜单设置为 Nunit 3,我希望 TeamCity 能够像以前一样自行捆绑/解析 Nunit。现在感觉它并没有比仅仅包括一个手动命令行构建步骤来自己封装到 Nunit 更好。
    【解决方案5】:

    TeamCity 运行器存在一些问题 - 具体而言,它的默认行为不是按照 NUnit2(和 NUnit3 Visual Studio 测试适配器)在自己的 AppDomain 中使用自己的基本目录运行规范。

    TeamCity 9.x 构建系列中有一个(当前未记录的)配置属性,可让您更改此行为。 I've written about it here.

    【讨论】:

    • NUnit runner 将在 TC v10 中具有“工作目录”字段。工作目录将等于 AppDomain 的 ApplicationBase,如果未指定,则等于测试程序集的目录。
    • 所以希望这是在 jetbrains 文档中。会为我节省很多时间。谢谢你,先生。
    【解决方案6】:

    尝试最新版本的脚本@NathanAldenSr

    仍然需要变量http://teamcityserver/admin/editProject.html?projectId=yourId&tab=projectParamsnunit.consolerunner.directory 参数添加到配置参数

    $SrcDirectory = "%teamcity.build.checkoutDir%"
    $PackagesDirectory = Join-Path $SrcDirectory packages
    
    Write-Output "PackagesDirectory" $PackagesDirectory
    
    $NUnitConsoleRunnerPackageDirectory = Get-ChildItem (Join-Path $PackagesDirectory NUnit.ConsoleRunner.*) | %{
        @{
            Directory = $_.FullName
            Version = [Version]::Parse(($_.Name -replace "NUnit.ConsoleRunner.",""))
        }
    } | Sort-Object Version -Descending | Select-Object -First 1 | %{ $_.Directory }
    
    if (!$NUnitConsoleRunnerPackageDirectory) {
        throw [IO.DirectoryNotFoundException] "NUnit console runner package directory not found"
    }
    
    $NUnitConsoleRunnerPackageDirectory = Join-Path $NUnitConsoleRunnerPackageDirectory tools
    
    Write-Output "NUnitConsoleRunnerPackageDirectory" $NUnitConsoleRunnerPackageDirectory
    Write-Output "##teamcity[setParameter name='nunit.consolerunner.directory' value='$NUnitConsoleRunnerPackageDirectory']"
    

    【讨论】:

      【解决方案7】:

      同样基于@NikolayP 的回答:

      NuGet 当前支持install 操作的命令行参数-ExcludeVersion。来自docs

      将包安装到仅以包名命名的文件夹中 不是版本号。

      这导致在后续 NUnit 运行器构建步骤中相当容易使用的路径,并允许删除 @NathanAldenSr 的 clever workaround

      从 TeamCity 2017.1.3(可能还有更早的版本)开始,此功能甚至作为 NuGet Installer 运行器的参数公开(请参阅恢复选项)但需要一个解决方案路径。下面的示例适用于 NUnit 的通用即时和临时安装。

      为了方便复制和粘贴(根据您的要求调整 NUnit 版本):

      • 可执行文件:%teamcity.tool.NuGet.CommandLine.DEFAULT%\tools\nuget.exe
      • 参数:install NUnit.Console -Version 3.7.0 -ExcludeVersion -OutputDirectory %system.teamcity.build.tempDir%\NUnit

      【讨论】:

        【解决方案8】:

        我知道现在是 2018 年 7 月,但我不清楚这些答案。为什么我需要在每个代理上安装一个控制台。一定有更好的方法。当我为运行测试添加构建步骤时,我注意到 NUnit 控制台工具路径的输入下的文本显示“支持相对于检出目录的路径”。我所做的只是将 nuget 包添加到我的解决方案中的测试项目中。我添加了 NUnit 版本 v3.10.1,然后添加了 NUnit.Console v3.8.0。然后在 Team City 我简单地添加了相对路径“packages\NUnit.ConsoleRunner.3.8.0\tools\nunit3-console.exe”

        【讨论】:

        • 如果您的单元测试项目之一已经安装了NUnit.Console 包,您可以使用它而无需单独安装。另一方面,我不喜欢安装不需要在开发人员机器上构建和运行测试的包,并尽可能将与构建机器相关的细节保留在项目文件之外。使用this answer 可以不用多说。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        • 1970-01-01
        相关资源
        最近更新 更多