TeamCity:NUnit无法找到目标程序集

时间:2017-06-07 03:17:26

标签: windows visual-studio github nunit teamcity

Windows 10 
Visual Studio 2017 
TeamCity 2017.1.2 
GitHub

我正在使用本地按预期运行的VS解决方案。 Main-project有一些包依赖。测试项目有项目参考主要项目。 VS本地编译成功。主项目引用+依赖项被复制到MyProject/bin/debug; test-project refs + dependencies被复制到MyProject.Tests/bin/debug; ReSharper本地测试运行成功。

但是我的TC项目在运行测试时遇到了问题。

我的build-config步骤是:从GitHub拉取,运行Visual Studio (sln) build,触发NUnit.ConsoleRunner运行测试vs内置程序集 - 这会抛出找不到文件的错误(找不到包依赖程序集)这可能表明构建步骤需要保存为依赖程序集的工件并将其复制到测试输出目录。

然而,查看代理工作目录,我发现主项目和测试项目中都存在依赖项程序集:

C:\TeamCity\buildAgent\work\64f706c42d79250c\{main-project}\bin\Debug\{dependency}.dll

C:\TeamCity\buildAgent\work\64f706c42d79250c\{tests-project}\bin\Debug\{dependency}.dll

表示VS构建步骤按预期将{dependency}.dll复制到bin中。

那为什么NUnit找不到呢?

[19:27:48][Step 5/5] MyProject.dll
[19:27:48][MyProject.dll] MyProject.UnitTests.MyTest
[19:27:49][MyProject.UnitTests.MyTest] System.IO.FileNotFoundException : Could not load file or assembly 'MyProjectDependency, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
[19:27:49]
[MyProject.UnitTests.MyTest]    at ReferencingCode()
   at MyProject.MyClass.Answer() in C:\TeamCity\buildAgent\work\64f706c42d79250c\MyProject\MyClass.cs:line 9
   at MyProject.UnitTests.MyTest() in C:\TeamCity\buildAgent\work\64f706c42d79250c\MyProject\UnitTests.cs:line 10
[19:27:51][Step 5/5] Failed tests detected

我想知道VS BuildNUnit步的输出dirs是否不同?但我的代理工作目录与我的本地VS解决方案目录相同 - 那么TC将在哪里找到NUnit工作目录?

2 个答案:

答案 0 :(得分:0)

看起来好像你有两个完全独立的输出目录,一个在测试项目下,另一个在主项目下。当然,您的测试在包含测试程序集的目录中运行。

输出消息似乎表示正在将主程序集复制到测试程序集目录中 - 来自测试项目的引用必须调用本地副本。我们可以告诉你,因为测试程序集和主程序集都在堆栈跟踪中有条目。但是,依赖程序集可能未被您的测试引用,因此不会被复制。至少这是我读它的方式 - 通过查看目录内容进行验证。

您可以通过对所有内容使用相同的输出目录来解决此问题,但这可能涉及更改您正在使用的目录结构。一个简单的解决方法是将依赖程序集的引用添加到测试项目中,并将本地副本设置为true。

答案 1 :(得分:0)

要在本地或在TeamCity中运行测试,您的测试项目必须具有对您正在测试的项目的项目引用。它没有任何其他方式。怎么还知道要测试什么?因此,检查测试项目中的引用,并确保在构建运行时输出是相同的位置" Debug"和"发布"。

另一方面,让TC进行实际构建和测试对于简单的东西来说很好,但是很难排除故障。我建议您使用PSake构建PowerShell脚本并创建一个"测试"任务。这样您就可以在本地运行脚本,TeamCity可以使用您在本地运行的相同脚本。