【问题标题】:TeamCity NUnit runner fails because of x86 - x64 - MSIL discrepanciesTeamCity NUnit 运行器因 x86 - x64 - MSIL 差异而失败
【发布时间】:2015-10-02 18:21:14
【问题描述】:

我有一个包含大量项目的解决方案,其中一些还有测试项目。这些都是为Any CPU平台编译的。

在 TeamCity 中,我有一个 NUnit 2.6.4 的构建配置,我在上面指定了 Platform: auto (MSIL)Version: 4.0

当我运行构建时,测试失败并显示以下消息:

NUnit error running tests in 'C:\BuildAgent\work\a58fc6cd9bf63032\JsonApi.Tests\obj\Release\JsonApi.Tests.dll' assembly
Loading assembly is compiled for v4.0.30319, MSIL
NUnit runner runtime is v4.0.30319, x64

更奇怪的是,当我刚刚关闭“首先运行最近失败的测试”(并更改其他内容)时,我得到了以下内容:

NUnit error running tests in 'C:\BuildAgent\work\a58fc6cd9bf63032\JsonApi.Owin.Tests\obj\Release\JsonApi.Owin.Tests.dll' assembly
Loading assembly is compiled for v4.0.30319, MSIL
NUnit runner runtime is v4.0.30319, x86

请注意,在一种情况下,跑步者是 x86,而在另一种情况下是 x64。在这两种情况下,它们都没有成功加载为 MSIL 编译的程序集。

我假设我的构建设置有问题,但是什么?

【问题讨论】:

  • @MichalHosala:感谢您查看此内容。不,只安装了一个构建代理。如果您想查看,我将失败的确切日志输出(包括以下几行)复制到 a gist

标签: nunit teamcity assembly-loading


【解决方案1】:

根据您提供的more detailed log,构建失败的真正原因似乎是:

...  
System.IO.FileNotFoundException: Could not load file or assembly 'System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 or one of its dependencies.  
The system cannot find the file specified.  
File name: 'System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35|'  

Server stack trace:  
    at System.Reflection.RuntimeAssembly.GetExportedTypes(RuntimeAssembly assembly, ObjectHandleOnStack retTypes)  
    at System.Reflection.RuntimeAssembly.GetExportedTypes()  
    at NUnit.Core.CoreExtensions.InstallAdhocExtensions(Assembly assembly)  
    at NUnit.Core.Builders.TestAssemblyBuilder.Load(String path)  
    at NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName, Boolean autoSuites)  
    at NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName, String testName, Boolean autoSuites)  
    at NUnit.Core.TestSuiteBuilder.Build(TestPackage package)  
    at NUnit.Core.SimpleTestRunner.Load(TestPackage package)  
    at NUnit.Core.ProxyTestRunner.Load(TestPackage package)  
    at NUnit.Core.ProxyTestRunner.Load(TestPackage package)  
    at NUnit.Core.RemoteTestRunner.Load(TestPackage package)  
    at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object|[|] args, Object server, Object|[|]& outArgs)  
    at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg)  
...  

而且我相信它的发生正是因为我在 cmets 中链接的SO thread 中提到的原因,即您正在从 obj 文件夹运行测试,而它应该是 bin 。但这仍然只是一个猜测,因为您没有提供 NUnit 步骤配置。

要解决此问题,您应该明确包含单元测试的程序集所在的路径。像这样的:

**\bin\**\*.Tests.dll

在“列出程序集文件:”下。这样,来自 obj 文件夹的程序集将不会被测试,请参阅 this SO thread

【讨论】:

  • 哈,干得好!这确实解决了问题:) 非常感谢!
  • (显然,我不能在 7 小时内奖励赏金,但我会在可以的时候!)
【解决方案2】:

在我的情况下,我得到了正确的文件夹,但是当我针对 nunit3 进行编译时,TeamCity 被设置为使用 nunit2.X 进行测试。更新 TeamCity 的测试步骤解决了这个问题。

【讨论】:

    【解决方案3】:

    这条消息我也有类似的问题

    检查正确的 .NET Framework 版本和进程平台(x64、x86、MSIL)用于测试运行器设置和这台机器上涉及的程序集。

    在我的情况下,原因是 NUnit 框架在代码和 Teamcity runner 中有不同的版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 2015-11-18
      • 1970-01-01
      • 2011-06-11
      • 2012-06-10
      相关资源
      最近更新 更多