【问题标题】:BadImageFormatException when running unit tests on build server在构建服务器上运行单元测试时出现 BadImageFormatException
【发布时间】:2019-11-15 11:10:31
【问题描述】:

我在一个使用 AnyCPU 架构的项目中有一套 NUnit 测试。其中一些测试使用来自 x86(32 位)程序集的类型。

当我在本地(通过 ReSharper)运行测试时,它们都通过了。

但是,当它们在 Jenkins 上使用 nunit3-console MyProject.csproj 命令执行时,引用 32 位程序集的测试会失败并出现 BadImageFormatException:

System.BadImageFormatException : Could not load file or assembly '...' or one of its dependencies. An attempt was made to load a program with an incorrect format.

如何让他们通过?

【问题讨论】:

    标签: c# jenkins console jenkins-pipeline nunit


    【解决方案1】:

    nunit3-console MyProject.csproj 默认在 64 位进程中运行测试,这使得无法加载 32 位程序集。这与构建服务器没有任何关系,因此在 TeamCity 等上也会发生同样的情况。

    解决方案是通过添加适当的标志来强制运行器使用 32 位进程:nunit3-console MyProject.csproj --x86

    运行dotnet xunit -x86可以解决xUnit的类似问题。

    我认为对于dotnet test 命令dotnet test --runtime win10-x86(带有适当的系统标志)会有所帮助。

    为什么在 ReSharper 中测试不会失败?

    默认情况下,ReSharper 测试运行程序会自动选择进程的“bittedness”。也许它会分析测试文件中的程序集引用,我不知道。无论如何,就我而言,它为我的单元测试选择了 32 位运行程序。当我强制它使用 64 位(单元测试会话 -> 选项 -> 平台 -> x64)时,一些测试失败并显示与 Jenkins 上相同的消息。

    【讨论】:

    • FWIW NUnit 默认也会查看测试程序集的位数。但它不查看引用,这就是存在 --x86 选项的原因。
    猜你喜欢
    • 2013-10-16
    • 2021-11-10
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    相关资源
    最近更新 更多