2017-06-07 62 views
0
Windows 10 
Visual Studio 2017 
TeamCity 2017.1.2 
GitHub 

我正在使用VS解决方案,该解决方案在本地表现如预期。主项目有一些程序包依赖性。测试项目对主项目有项目引用。 VS本地编译成功。主项目参考+相关性被复制到MyProject/bin/debug;测试项目引用+依赖项被复制到MyProject.Tests/bin/debug; ReSharper本地运行测试成功。TeamCity:NUnit无法找到目标程序集的依赖关系

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

我积累的配置步骤是:从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步骤不同?但是我的代理工作目录与我的本地VS解决方案目录相同 - 那么TC将在哪里找到NUnit工作目录?

+0

我不知道我明白你有什么问题以及你在做什么。单元测试不使用程序集。他们使用源代码。这是白盒测试。即单元测试直接与您的代码一起工作。 –

+0

本地我的测试项目有一个项目引用到我的主项目; VS解决方案构建将主项目程序集及其依赖项程序集复制到测试项目的“debug/bin”文件夹中,然后“ReSharper”对这些程序集运行测试。 – BaltoStar

回答

0

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

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

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

+0

检查代理工作目录显示与本地VS相同的文件夹结构后编译:main + test子文件夹,每个都有'/ debug/bin',并且依赖程序集*存在于测试程序集bin中,所以显然VS构建步骤是在那里复制它。你是否在说TC正在创建一些其他的输出目录,专门用于运行测试?但是这个位于代理的位置?我不喜欢在我的测试项目中添加copy-local引用依赖项,因为它不需要桌面VS编译/运行测试 - 仅为了TC而添加ref会导致编写代码的人感到困惑 - -线。 – BaltoStar

+0

检查TeamCity生成的'.nunit'文件。这将显示事情在执行时的位置。或者只是运行一个显示其组装位置的测试。 – Charlie

0

为了让您的测试在本地或在TeamCity中运行,您的测试项目必须对您正在测试的项目具有项目引用。它不能以其他方式工作。它还会怎样知道要测试什么?因此,请在测试项目中检查您的引用,并确保构建以“Debug”和“Release”形式运行时输出是相同的。

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

+0

当在本地使用解决方案时,所有工作均按预期进行。我的测试项目有一个主要项目的参考。 VS本地编译成功;主项目引用+依赖项被复制到'MyProject/bin/debug';测试项目引用+依赖项被复制到'MyProject.Tests/bin/debug';本地测试运行成功。一切如预期。我的问题出现在构建代理上:令人困惑的是代理工作目录与我的本地解决方案看起来完全相同dir - “MyProject.Tests/bin/debug”包含要测试的程序集及其依赖关系。所以为什么'NUnit.Console'找不到? – BaltoStar

+0

我没有足够的信息来确定NUnit为什么找不到您的参考。您可以复制构建命令并从代理上的命令行运行它,并查看您获得的内容。这就是为什么我建议创建一个脚本在本地使用。 –

相关问题