Мы начали использовать библиотеку блочных тестов наддува для большой существующей кодовой базы, и у меня возникли некоторые проблемы с неправильным прохождением модульных тестов, по-видимому, из-за повторного использования памяти в стеке.
Вот моя ситуация:
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, чтобы, если переменная-член оставалась неинициализированной, модульный тест мог ее перехватить. В противном случае только первый модульный тест принесет пользу.
Я обновился до буста 1.41, но проблема не была решена. Это несколько повлияло на проблему в некоторых тестовых случаях, но не до такой степени, что весь тест не прошел должным образом.