c++ - Boost 单元测试内存重用导致本应无法通过的测试

标签 c++ unit-testing memory boost callstack

我们已经开始对现有的大型代码库使用 boost 单元测试库,并且我遇到了一些单元测试错误通过的问题,这似乎是由于堆栈上内存的重用造成的。

这是我的情况:

BOOST_AUTO_TEST_CASE(test_select_base_instantiation_default)  
{
    SelectBase selectBase();
    BOOST_CHECK_EQUAL( selectBase.getSelectType(), false);
    BOOST_CHECK_EQUAL( selectBase.getTypeName(_T(""));
    BOOST_CHECK_EQUAL( selectBase.getEntityType(), -1);
    BOOST_CHECK_EQUAL( selectBase.getDataPos(), -1);
}

BOOST_AUTO_TEST_CASE(test_select_base_instantiation_parameterized)  
{  
    SelectBase selectBase(true, _T("abc"));  
    BOOST_CHECK_EQUAL( selectBase.getSelectType(), false);  
    BOOST_CHECK_EQUAL( selectBase.getTypeName(_T("abc"));
    BOOST_CHECK_EQUAL( selectBase.getEntityType(), -1);
    BOOST_CHECK_EQUAL( selectBase.getDataPos(), -1);
}

第一个测试正确通过,初始化了所有变量。
第二个单元测试中的构造函数没有正确设置EntityType或DataPosition,但单元测试通过了。通过在第二次测试中将一些变量放在堆栈上,我能够让它失败,如下所示:

BOOST_AUTO_TEST_CASE(test_select_base_instantiation_parameterized)  
{  
    int a, b;
    SelectBase selectBase(true, _T("abc"));  
    BOOST_CHECK_EQUAL( selectBase.getSelectType(), false);  
    BOOST_CHECK_EQUAL( selectBase.getTypeName(_T("abc"));
    BOOST_CHECK_EQUAL( selectBase.getEntityType(), -1);
    BOOST_CHECK_EQUAL( selectBase.getDataPos(), -1);
}

如果只有一个 int,则只有 EntityType CHECK_EQUAL 失败,但如果有两个,EntityType 和 DataPos 都会失败,因此很明显,这是在同一堆栈内存或某些内存上创建的变量的问题这样的。

是否有一个好方法来清除每个单元测试之间的内存,或者我是否可能错误地使用该库或编写错误的测试?任何帮助将不胜感激。

更新:
Select base 是一个简单的类,只有 bool、int 和 CString 成员变量。它是一个基类,用于处理更复杂实现的状态,因此它不会访问任何全局变量或全局状态。

我需要的是一种在调用之间设置内存的方法,例如 0xdeadf00d,这样,如果成员变量未初始化,单元测试就可以捕获它。否则只有第一个单元测试才有用。

我更新到了boost 1.41,但问题没有解决。它确实在某些测试用例中对问题产生了一定的影响,但还没有达到所有测试都会正常失败的程度。

最佳答案

不要在不同的测试中重复使用测试用例名称。

相反,可以这样调用它们:

test_select_base_instantiation_default_1

test_select_base_instantiation_default_2

关于c++ - Boost 单元测试内存重用导致本应无法通过的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2547988/

相关文章:

c++ - Boost asio ip tcp iostream 是否支持异步?

c++ - x86 和 x64 堆栈帧

C++ 将数组写入注册表中的二进制条目

unit-testing - 如何仅在 Hybris 项目中运行单元测试?

visual-studio - 构建单元测试

c++ - 动态堆栈内存重新分配

Android - 在将位图保存到结果 Activity 中的 SDCARD 之前压缩位图

c++ - 使用给定键填充包含所有多映射值的 vector

java - DbUnit + springtestdbunit 中的表计数错误

c++ - 长时间运行的 C++ 应用程序中的内存泄漏