MSTest拒绝运行64位?

18

我正在使用Outlook Redemption编写应用程序的测试,该应用程序必须在64位系统下运行(它需要连接到Windows MAPI和Outlook x64)。不幸的是,无论如何我都不能使它在64位下运行测试。我尝试使用一个.runsettings文件(编辑以指示为64位)和一个.testsettings文件(同样被编辑),最后我选择了测试>测试设置>默认处理器架构> 64位,但都没有成功。

每次,System.Environment.Is64BitProcess的返回值都是false,当我加载dll以连接到Outlook和MAPI时,我会遇到可怕的COM异常:应用程序的错误操作系统或操作系统版本 (HRESULT:0x800401FA (CO_E_WRONGOSFORAPP)),这表明安装了64位的Outlook,而尝试访问它的进程是32位。

我已经按照某些地方所说的重新启动了VS 2012,因为更改设置后可能需要重启。请问有没有其他建议?我可以将其作为控制台应用程序编写,运行非正式测试并报告其状态,但我的下一步是将这些测试集成到自动化构建中。非常感谢您的帮助。

编辑

.testsettings页面的主机设置截图: 输入图像描述

实验

有趣的是,我进行了一个小实验。我创建了一个新的解决方案,其中只有一个控制台应用程序项目。我在其中放置了一个公共方法,该方法仅返回true。当我运行控制台应用程序并暂停执行时,我查看了一下,它确实在64位上运行;这没有问题。然后,我添加了一个测试项目,创建了一个调用该方法的单个测试。我还添加了var is64 = Environment.Is64bitProcess并在其后面设置断点。

可以预见的是,未更改任何选项时,is64为false。我从测试下拉菜单中选择了默认的64位架构,然后清理了解决方案,并再次运行测试,结果相同,以32位运行。我重新启动了VS2012,清理了项目,生成了项目,结果还是一样的。我创建了一个testsettings文件并在测试菜单中引用它,进行了清理生成操作,但结果仍然相同。我创建了一个runsettings文件,设置<TargetPlatform>x64</TargetPlatform>,在测试菜单中引用它,重新运行了所有步骤,结果还是一样的。QTAgent32.exe继续运行该进程,并且绝对不会听从我的要求以64位运行。
我发誓,如果我必须删除QTAgent32.exe并将QTAgent重命名为该名称,我会这么做。当计算机想要固执己见时,我不会放过强制执行我的意愿。请,如果你不想看到我虐待工作站,请有人告诉我出了什么问题。为电脑着想。

也许这是一个愚蠢的问题,但你确定这些是你测试运行所选的“设置”吗? - chaliasos
是的。与该文件对应的“测试”菜单下的“路径”菜单项旁边有一个勾号。 - CodeWarrior
他们在2012年修复了这个问题。有一个64位测试主机。像其他人说的那样,您可以使用corflags从mstest中删除32位标志,然后需要从wow注册表节点复制一些许可证注册表设置,并将executionhost设置为msil。在我的团队中,我们无法向构建机器添加注册表设置,因此我编写了一个小应用程序,生成带有测试元数据和测试存根的代理程序集,当执行测试时,代理程序加载测试dll并执行实际测试。 - user1985513
如果实现它的规定方式是从MSTest中删除32位标志并在注册表中进行调整等操作,那么我会说它在2012年肯定没有被修复。虽然你可以强制它工作,但这并不意味着它已经被修复了。我已经在这上面花费了太多时间,但我以后可能还有更多的时间来处理它。目前,我认为它仍然是坏的。一旦微软将其设置到一个状态,使其接受设置并根据设置行事而无需对MSTest进行修改,那么我会同意。 - CodeWarrior
3个回答

22

如果您使用的是VS2012,则可以通过以下测试设置选择您的平台x64;

输入图像描述

在此示例中,我指的是.runsettings文件。 设置如下:

输入图像描述

但是,如果希望通过命令行运行测试,则需要使用vstest.console.exe而不是MSTEST,因为它不支持x64 test.dlls

您将在“C:\Program Files (x86)\Common7\IDE\CommonExtensions\Microsoft\TestWindow\”找到vstest.console.exe

请注意以下步骤

  1. 打开CMD
  2. 导航到“C:\Program Files (x86)\Common7\IDE\CommonExtensions\Microsoft\TestWindow\”
  3. 执行vstest.console.exe "C:\Projects\Test\Test.Automation.Specs.dll" /InIsolation /platform:x64

注意:Test.Automation.Specs.dll是您的测试项目,您需要定义完整路径

希望这有所帮助。


9

我刚遇到了同样的问题。以下是您可以遵循的步骤来解决问题。

  1. 将默认的单元测试处理器架构从x86改为x64:转到“测试”->“测试设置”->“默认处理器架构”->“x64”。Screenshot for changing the default processor architecture to x64 for test settings.
  2. 更改单元测试项目的构建设置为x64。Screenshot for changing the build settings to x64.
  3. 清理解决方案,然后重新构建解决方案。您的单元测试现在应该显示在测试资源管理器中,并且您不应再遇到此问题。

引用资料

  1. MSDN参考链接,解释如何解决此问题。

谢谢你的回答。你在用哪个版本的Visual Studio?我发帖时使用的是Visual Studio 2012。自那以后,我从未回头解决过这个问题(实际上,我已经换了三份工作!),所以希望微软已经完全实现了x64支持进行测试,而不仅仅是说它已经完成了,而事实上并没有完成。 - CodeWarrior
2
我正在使用Visual Studio 2015。 - user3613932
好的,知道了。MSTest可以在VS 2015中以64位运行测试。谢谢! - CodeWarrior
我认为这只能通过IDE工作。当我尝试在命令行运行MSTest.exe时,它会抱怨DLL格式错误。我认为MSTest实际上是一个32位应用程序。 - Christian Findlay
你说得对,我只是通过IDE测试过这个。如果你在命令行找到了正确的解决方法,请随意更改答案。 - user3613932

3

这与我的范围有些不同,但是两个项目的配置设置都正确吗?你把它们设置为AnyCPU或x64来构建了吗?

只是试图用奥卡姆剃刀原理来解决问题...我知道我曾经因为VS神奇地决定更改我的配置设置而感到沮丧太多次了。


的确。已设置为 AnyCPU,在一台 x64 机器上运行,使用的是 Windows 7 的 x64 版本。 - CodeWarrior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接