我从一个现有的、单一的、.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