我们已经开始对现有的大型代码库使用 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/