【发布时间】:2016-02-25 20:35:28
【问题描述】:
TeamCity 9.1.x 现在支持 NUnit 3.0,但是您必须安装运行程序并在步骤中指定 nunit3.console.exe 的路径。我的问题是我在哪里复制 nunit3-console.exe?我必须把这个放在所有的代理上吗?我是否将它放在我的 TeamCity 主服务器上的目录中,它会被代理共享或拉取?似乎没有很好的文档说明将这些文件复制到何处以便所有代理都可以使用它们。
【问题讨论】:
TeamCity 9.1.x 现在支持 NUnit 3.0,但是您必须安装运行程序并在步骤中指定 nunit3.console.exe 的路径。我的问题是我在哪里复制 nunit3-console.exe?我必须把这个放在所有的代理上吗?我是否将它放在我的 TeamCity 主服务器上的目录中,它会被代理共享或拉取?似乎没有很好的文档说明将这些文件复制到何处以便所有代理都可以使用它们。
【问题讨论】:
您应该在要运行 NUnit 测试的每个代理上都有 NUnit 控制台。
最好的选择是:
添加对 NuGet 包的引用 (https://www.nuget.org/packages/NUnit.Runners/)。
要恢复包,您可以使用“NuGet Installer”构建步骤,请参阅以下博客文章:https://blog.jetbrains.com/teamcity/2013/08/nuget-package-restore-with-teamcity/
之后,您只需从还原的 NuGet 包中设置路径,如“packages\NUnit.Console.3.0.0\tools\nunit3-console.exe”。
【讨论】:
packages 路径中的硬编码版本号不是最理想的;开发人员必须在所有构建配置中保持版本同步,这样硬编码的目录名称才能起作用。也许可以设置一个单独的构建步骤来检测正确的路径并将其分配给一个变量?
基于@NikolayP 的回答:
- 添加对 NuGet 包的引用 (https://www.nuget.org/packages/NUnit.Runners/)。
- 要恢复包,您可以使用“NuGet Installer”构建步骤,请参阅以下博客文章:https://blog.jetbrains.com/teamcity/2013/08/nuget-package-restore-with-teamcity/
- 之后,您只需从还原的 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 目录,该脚本也会抛出异常。
【讨论】:
Split-Path,我能够获取已经需要在项目中设置的信息并确定正确的包目录,并将 tools/nunit3-console.exe 的完整路径返回到 Nunit3Path 变量中。跨度>
【讨论】:
构建正在代理上运行,因此您需要在要运行构建的所有代理上安装 NUnit3。
【讨论】:
TeamCity 运行器存在一些问题 - 具体而言,它的默认行为不是按照 NUnit2(和 NUnit3 Visual Studio 测试适配器)在自己的 AppDomain 中使用自己的基本目录运行规范。
TeamCity 9.x 构建系列中有一个(当前未记录的)配置属性,可让您更改此行为。 I've written about it here.
【讨论】:
尝试最新版本的脚本@NathanAldenSr
仍然需要变量http://teamcityserver/admin/editProject.html?projectId=yourId&tab=projectParams 将 nunit.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']"
【讨论】:
同样基于@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
【讨论】:
我知道现在是 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 可以不用多说。