我从一个现有的、单一的、.exe 本机 Visual Studio 2012 项目开始。根据http://msdn.microsoft.com/en-us/library/hh419385.aspx#objectRef ,我想在旁边添加一个本机单元测试项目,这表明这是受支持的:
被测代码构建为 .exe 文件: 添加单独的测试项目。将其链接到输出对象文件。
我dllexport编写了我需要测试的方法,将我的测试项目与 exe 项目的.lib库链接起来,这对我的简单测试功能似乎有效。但是,一旦我尝试了一些更有趣的事情,我就开始遇到像这样的访问冲突:
vstest.executionengine.x86.exe 中 0x04fa4aac (TestApplication.exe) 的第一次机会异常:0xC0000005:访问冲突读取位置 0x011bf0e0。
因此,我使用我可以召集的最简单的 .exe 和 Unity Test 项目对创建了一个新的解决方案,并且我能够使用这个调用者(单元测试项目)和被调用者(.exe 项目)重现异常:
被调用者(.exe 项目)Header.h:
#include <string>
__declspec( dllexport ) std::string __cdecl strTest( std::string j );
被调用者(.exe 项目)Header.cpp:
#include "Header.h"
std::string strTest( std::string j ) {
std::string output;
output += j;
output += "HAHA";
return output;
}
调用者(单元测试项目)unittest1.cpp:
#include "CppUnitTest.h"
#include "../TestApplication/Header.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest {
TEST_CLASS(UnitTest1) {
public:
TEST_METHOD(TestMethod1) {
std::string test = strTest( "bla " );
}
};
}
访问冲突总是发生在由 in 中的行std::string调用的构造函数内部。std::string output;strTest()
我确保这两个项目具有相同的设置(尤其是调用约定、优化/调试设置、位和字符集)。我还禁用并删除了两个项目的预编译头文件。
我什至尝试使用上述功能创建第二个 exe 项目,并将我的主 exe 项目链接到第二个 exe 项目。这非常有效。当我尝试将我的单元测试项目链接到第二个 exe 项目时,就像我让我的主 exe 项目工作一样,我再次遇到了相同的访问冲突。
唯一有效的是将我的 exe 项目转换为 dll 项目(实际上只是将我的 exe 项目的配置类型从Application (.exe)更改为Dynamic Library (.dll))。
所以问题是,我是否可以使用 Visual Studio 2012 的单元测试以某种方式让我的 exe 项目可单元测试,还是应该开始将其拆分为 dll?
编辑:
我在 Microsoft Connect 上提交了一个问题,并被告知这确实是一个错误: https ://connect.microsoft.com/VisualStudio/feedback/details/804696/linking-visual-studio-2012-c-unit-testing -project-against-an-exe-causes-access-violations
我使用我在 VMware Workstation 9 虚拟机上全新安装的 Windows 7 Pro x64 SP1 和 Windows 8.1 Pro Preview x64 上附加的相同解决方案进行了更多测试。每次测试都安装了所有 Windows 更新和特定的 Visual Studio。我总是在测试之间恢复到干净的快照。我还使用所有默认设置运行了所有 Visual Studio。
在 Windows 7 上,我尝试的一切都给了我同样的访问冲突。我尝试了我的解决方案:
- Visual Studio Express 2012 for Windows Desktop w/ Update 2
- Visual Studio Express 2012 for Windows Desktop w/ Update 3
- 带有更新 3 的 Visual Studio 2012 Ultimate
- Visual Studio 2013 RC 专业版
在 Windows 8.1 上,使用 Visual Studio Express 2012 for Windows Desktop w/Update 3 我的单元测试运行良好。我假设我在 Windows 7 上尝试的其他组合在 8.1 上都可以正常工作。
回到 Windows 7,当我从 x86 切换到 x64 平台并将测试设置的默认处理器架构设置为 X64 时,相同的测试通过了。我不再有访问冲突。
所以这可能是(Windows 7/x86 平台)特定的问题。
此外,关于访问冲突,它并不总是那么优雅。我有时也会收到一个“vstest.executionengine.x86.exe 已停止工作”对话框,其中包含以下问题详细信息:
Problem signature:
Problem Event Name: BEX
Application Name: vstest.executionengine.x86.exe
Application Version: 12.0.20827.3
Application Timestamp: 521cc637
Fault Module Name: StackHash_9321
Fault Module Version: 0.0.0.0
Fault Module Timestamp: 00000000
Exception Offset: 00ae9998
Exception Code: c0000005
Exception Data: 00000008
OS Version: 6.1.7601.2.1.0.256.1
Locale ID: 1033
Additional Information 1: 9321
Additional Information 2: 9321642ea520dd869526c054c7161ae9
Additional Information 3: bfae
Additional Information 4: bfaed60192419c1d7d34eac41dbe71a8