如何指定NUnit测试运行器以64位执行测试

问题描述:

我有很多UnitTests,全部配置为AnyCPU。我们希望他们在BUILD机器上运行x64。构建机上运行基本NUNIT控制台跑步者詹金斯服务器:如何指定NUnit测试运行器以64位执行测试

C:\nunit-console\nunit3-console.exe path-to-my-solution.sln --config=Debug --agents=1 --process=Separate --result=TestResult.xml;format=nunit2 --timeout=300000 --workers=1 

出于测试目的,我有这个单元测试:

[Test] 
public void TestProcess() 
{ 
    Assert.AreEqual(Environment.Is64BitProcess, true); 
} 

在Visual Studio中,如果我去Test -> Test Settings -> Default Processor Architecture,它如果我选择x86,则失败,但如果选择x64,则成功。

有没有办法执行直接throught的nunit3-console.exe测试时无在测试项目(这里不讨论它的目标改变平台具有相同的行为,我们只是承认我们有一些理由来保持它作为“任何CPU”)。

我发现这个https://msdn.microsoft.com/en-us/library/ee782531.aspx它解释说,要在Visual Studio上做到这一点,我们可以选择我的方法,要么选择创建一个test.runsettings

我试图创建一个test.runsettings文件,包含以下内容:

<?xml version="1.0" encoding="utf-8"?> 
<RunSettings> 
    <!-- Configurations that affect the Test Framework --> 
    <RunConfiguration> 
    <!-- [x86] | x64  
     - You can also change it from menu Test, Test Settings, Default Processor Architecture --> 
    <TargetPlatform>x64</TargetPlatform> 
    </RunConfiguration> 
</RunSettings> 

我已经把它放在我的解决方案的根,我已经做了Test -> Test Settings -> Select Test Settings file。 奇怪的部分是,我感觉这个操作(将该文件设置为“测试设置文件”在我提交时并未保留,因为如果我在另一台计算机上进行了最新更改,那么完成后,我必须再次设定

但我的单元测试仍然失败build机器上的任何想法替代的还是什么,我错在这里做

+0

如果您使用的是NUnit控制台运行程序,则有关适配器,测试设置等的信息都不相关。所有这些只适用于在Visual Studio下运行测试。请修改以包含与您如何运行测试相关的信息。 – Charlie

+0

@Charlie NUnit控制台不使用'runsettings'文件?我使用提供的命令行运行测试,并试图在控制台(使用NUnit控制台)中模拟Visual Studio中的结果(以及适配器)。 – J4N

+0

'.runsettings'文件是一个VS功能,与nunit控制台运行无关。 – Charlie

从基本的问题开始:。。?“如何指定NUnit的[控制台]测试运行器执行64位测试?“答案是什么都没有

纯IL组件(AnyCpu目标)作为64位p在具有64位操作系统的64位机器上执行操作。你不必做任何事情。控制台运行程序提供了一个--x86选项以32位进程运行您的AnyCpu代码,但不存在相应的64位选项,因为它不是必需的。

有几种方法你能打败这个默认: 1.运行在32位机器上或下的OS 2.强制测试,在32位进程中运行的32位版本 3 。运行一个目标为32位的测试。

我怀疑你正在做的两个2和3

通过运行.sln文件,你问NUnit的加载在方案规定的每一个组件。因为您使用了--process=Separate选项,所以您将强制所有这些程序集在相同的进程中加载​​。如果这些程序集(包括非测试程序集)需要32位,那么即使一个也需要32位,那么该独立进程将是32位进程。

请注意,--process=Separate选项不会在其自己的进程中运行每个程序集,而是在与主进程分离的单个进程中运行。如果您在不阅读文档的情况下使用它,这是略微不直观的。

我的建议是 1.不要在命令行上添加任何选项,除非您了解他们的操作,并确定您确实需要它们。 NUnit被设计为当你使用默认值时自己弄清楚事情,但是使用你提供的任何选项,不管它看起来有多疯狂! 2.阅读文档

作为一个起点,这个命令应该为你工作...

nunit3-console path-to-assembly.dll path-to-another-assembly.dll

至于其他选项... * --process:Separate是一个坏主意。让它默认为Multiple。 * --agents=1如果您希望每个进程在下一次启动之前运行,则可以。 * --workers=1只有在某些测试使用[Parallelizable]并且您试图将其禁用时才有意义。

如果您使用的解决方案是因为在命令行中放置的组件太多,则上述可能会有效,程序集是NUnit可以加载的程序集。使用默认流程设置有更好的机会。否则,我建议使用NUnit项目。

+0

我发现我有一个单元测试项目引用了“首选32位”标志(但仍然内置在AnyCPU中)。如果我在Visual Studio上将“首选体系结构”设置为64位,则我的单元测试可以与nunit测试适配器一起使用,但不能与nunit控制台一起使用。所以在某些情况下,“强制”测试运行在64位是有意义的。 – J4N

+0

您澄清说您正在使用控制台运行程序,所以我给了您一个更改列表。你有尝试过吗?如果问题出在适配器上,我会给出有关适配器的建议。 THey是两个不同的程序,运行测试的方式不同。 – Charlie

+0

我不能,我已经有超过30个项目进行测试,并且正在增长,我无法手动指定它们中的每一个。单独是强制性的,因为我们有一些设计不佳的测试正在达到一些在注册期间必须是独立的“注册”。我们希望确保每次只运行一次测试。无论如何,如果它使用适配器而不是控制台时,我有一个“首选32位”标志,我不明白为什么运行测试分开会改变任何东西。如果我删除了首选32位标志,它将起作用,因此它与您提到的所有参数无关。 – J4N