我们已经开始将 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,但问题没有解决。它确实在某些测试用例中对问题产生了一定的影响,但并没有达到所有测试都会正确失败的程度。