【问题标题】:Unit Tests fail with exception code c0000005单元测试失败,异常代码 c0000005
【发布时间】:2013-08-12 16:11:00
【问题描述】:

我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试。

这是我的测试:

TEST_METHOD(CalculationsRoundTests)
{
    int result = Calculations::Round(1.0);
    Assert::AreEqual(1, result);
}

导出类:

#ifdef EXPORT_TEST_FUNCTIONS
#define MY_CALCULATIONS_EXPORT __declspec(dllexport)
#else
#define MY_CALCULATIONS_EXPORT
#endif
...
class CALCULATIONS_EXPORT Calculations {
...
public:
static int Round(const double& x);

函数本身:

int Calculations::Round(const double& x)
{
    int temp;
    if (floor(x) + 0.5 > x)
        temp = floor(x);
    else
        temp = ceil(x);

    return int(temp);
}

但是,测试几乎总是失败,错误代码为 c0000005(访问冲突)。 第一次使用 x 或任何其他可能在函数中声明的变量时,测试将失败。

我按照Unresolved externals when compiling unit tests for Visual C++ 2012的说明进行操作

【问题讨论】:

  • 确保您的 DLL 您的测试应用程序使用相同的调用约定。有很多方法可以做到这一点,最直接的是将它推到标头本身的 decl 中,是的,在 class-def 内):static int _stdcall Round(const double&); 注意放置。有些人更喜欢用宏来做这件事。怎么做是你的选择。
  • @WhozCraig dll 和测试应用程序最初都使用 __declspec。我在 Round 函数前面添加了 _stdcall,并将测试应用程序更改为 _stdcall。现在,测试将在大约一半的时间内通过,而在另一半的时间里将因相同的异常而失败。

标签: c++ unit-testing visual-studio-2012


【解决方案1】:

这是known bug。不幸的是,微软认为这是“不会修复”。

简而言之,有两种解决方法:

  1. 在发布模式下编译实际项目,在调试模式下编译测试项目。
  2. 将所有可测试函数外包给静态库项目。

【讨论】:

    【解决方案2】:

    我从来不知道为什么测试在运行时会导致访问冲突;但是,我确定我设置了错误。

    为了消除此错误,我更改了 Visual Studio 解决方案的结构,使大部分代码位于静态库 (.lib) 项目中,该项目将包含我的程序的实现。这样,项目中我的程序的所有类和函数都会自动导出,所以我不需要使用__declspec(dllexport)。

    然后,我创建了一个小型 Win32 控制台应用程序,它将为我的程序创建 .exe 文件,该文件引用 .lib 项目。这个项目的目的是为我的程序创建可执行文件,所以它只需要一个 main 来调用我在 .lib 项目中的代码的开头。

    完成此操作后,我只需让本机单元测试项目也引用 .lib 项目即可轻松运行,此后我没有遇到任何访问错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 2010-11-19
      • 2014-04-09
      • 2019-04-09
      • 2015-12-27
      • 2013-02-26
      • 1970-01-01
      相关资源
      最近更新 更多