4

我从一个现有的、单一的、.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 上,我尝试的一切都给了我同样的访问冲突。我尝试了我的解决方案:

  1. Visual Studio Express 2012 for Windows Desktop w/ Update 2
  2. Visual Studio Express 2012 for Windows Desktop w/ Update 3
  3. 带有更新 3 的 Visual Studio 2012 Ultimate
  4. 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
4

0 回答 0