Повторное использование памяти в модуле Boost для тестирования, которое не может пройти - PullRequest
2 голосов
/ 30 марта 2010

Мы начали использовать библиотеку блочных тестов наддува для большой существующей кодовой базы, и у меня возникли некоторые проблемы с неправильным прохождением модульных тестов, по-видимому, из-за повторного использования памяти в стеке.

Вот моя ситуация:

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

Ответы [ 4 ]

2 голосов
/ 01 апреля 2010

Попробуйте BOOST_TEST_RANDOM , если хотите ++ паранойя.

2 голосов
/ 30 марта 2010

Не используйте повторно имя тестового набора для различных тестов.

Вместо этого назовите их примерно так:

test_select_base_instantiation_default_1

test_select_base_instantiation_default_2
1 голос
/ 31 марта 2010

Тогда в представленном коде нет ничего плохого.

Похоже, вы обращаетесь к неинициализированным данным в SelectBase или любой из ее зависимостей, если она есть. Либо вы обращаетесь к глобальному состоянию в SelectBase, либо оно самостоятельно создает зависимости. Оба не одобряются.

0 голосов
/ 06 апреля 2010

Я закончил тем, что написал функцию для установки объекта в недопустимое состояние после каждого теста:

void unsetSelectBase(SelectBase selectBase) 
{
    selectBase.setSelectType(true);
    selectBase.getTypeName(_T("InvalidName"));
    selectBase.getEntityType(42);
    selectBase.getDataPos(2718);
}

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);
    unsetSelectBase(selectBase);
}


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);
    unsetSelectBase(selectBase);
}

Это вызывает сбой всех тестовых случаев, когда какие-либо переменные-члены не инициализированы. Я предполагаю, что это просто еще одна ручная задача установки / удаления типа, которая необходима, поскольку среда не очищает память.

...