c++ - 使用 GTest 访问违规读取位置,无需任何复杂测试

标签 c++ c unit-testing object googletest

我在一个我自己无法解决的问题上被困了一个星期。

描述: 我的老板决定用 C 语言实现 C++ 对象,因为他喜欢 GTesting 方法(不能使用 90% 的可能性,因为 C 不包含对象)。 我像聪明人在这个网站上做的那样做了:http://research.engineering.wustl.edu/~beardj/Mixed_C_C++.html

我在更大的函数中使用了它们,它工作得很好,没有任何问题,没有内存泄漏,什么都没有......通过接口(interface)完美地调用了假函数。

当我想在这个函数上应用 GTest,通过接口(interface)(双用途 header )调用这些 C++ 对象时,甚至当我想调用 GTest 时,问题就来了。

这里是源代码:

这是包含所有 GTest 和 GMock 方法的文件。这是在其他地方工作的通用文件。

InitGMock.h

#ifndef INITGMOCK_H_
#define INITGMOCK_H_


#include "GTest/gtest.h"
#include "GMock/gmock.h"


#define UNREFERENCED_PARAMETER(P)      (void)(P)

using ::testing::Return;
using ::testing::Cardinality;
using ::testing::AtLeast;
using ::testing::_;
using ::testing::An;
using ::testing::A;
using ::testing::Ge;
using ::testing::Eq;
using ::testing::InSequence;
using ::testing::internal::ExpectationTester;

... and so on, using all testing methods

这是主要的 cpp 文件。

main.cpp

#include "InitGMock.h"  
extern "C"
{
#include "LPAll_Testing_3.h" //all includes from C files
}


int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);

::testing::TestEventListeners& listeners = ::testing::UnitTest::GetInstance()->listeners();
listeners.Append(new MemoryLeakListener);


RUN_ALL_TESTS();

getchar(); // keep console window open until Return keystroke 
return 0;
}

这是我的测试

测试.cpp

#include "LPAll_Testing_3.h"
#include "InitGMock.h"

TEST(oLocalPsiTestingClass, FirstTest) 
{

    EXPECT_EQ(7,7);
}  

我现在的想法是: 1. 有时程序没有崩溃,进行测试(但失败)。

  1. 当测试失败时,在dbghook.c文件中失败

  2. TEST() 被调用了两次,原因我不知道。第一个紧接在程序启动之后,第二个在 RUN_ALL_TESTS(); 命令之后

  3. 程序结束后出错: LP_Testing.exe 中 0x0047aae0 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xcccccc1c。 未知文件:错误:测试主体中抛出代码为 0xc0000005 的 SEH 异常。

  4. 我尝试使用其他主要签名:

    • int main(int argc, char **argv)//原始
    • //int main(int argc, _TCHAR* argv[])
    • //int _tmain(int argc, _TCHAR* argv[])

但没有人正常工作

如果有人知道如何解决这个问题,我会非常高兴,因为我开始绝望了。 :-)

谢谢,祝你有美好的一天。如果您需要一些其他信息或源代码,请询问。 :-)

编辑: 我又发现了一个奇怪的问题。 当我调用宏 EXPECT_EQ(7,7) 时,它会抛出错误 当前位置没有可用的源代码。 - VS2005 错误消息。我已经包含了 gtest.lib 和 gmock.lib(以及它们所在的目录),所以它应该看到这个命令。此外,当我想查看声明和定义时,它会将我重定向到 gtest.h

最佳答案

嗯, 我管理了一些解决方案,但它至少不稳定...

首先,我尝试添加一些“虚拟”测试:

TEST(DummyObject,FirstTest)
{
EXPECT_TRUE(TRUE);
}

然后清理并重建解决方案。 在这个过程解决方案识别出有问题的命令之后,但它仍然无法正常工作 - 大量内存泄漏,测试有时评估不正确等等。

伙计们,注意在 C++ 单元测试工具中通过 C 接口(interface)测试 C++ 对象!!! :D

关于c++ - 使用 GTest 访问违规读取位置,无需任何复杂测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23239185/

相关文章:

c++ - 为什么在 ISO/IEC 14882 :2011? 中定义了一个独特的 "inter-thread happens before"关系

c++ - boost mpl fold 占位符表达式无法编译

c - 使用 ptrace 从结构中检索信息

c# - 如何在未引用的程序集中提取方法的属性值

javascript - 开 Jest : Vue Component can't find mocked function

c++ - 使用 FBO 绘制到渲染缓冲区

c++ - 确保一个小部件有一个容器?

c++ - c 遗留代码给我左侧的指针;需要正确错误的积分值

c - GTK+2 : Drawing above other widgets transparently

c++ - 使用具有相对路径的文件的 Visual Studio 单元测试