инициализация буст-теста для каждого набора (не случай)

Мне нужно инициализировать некоторые переменные, которые являются «глобальными» внутри BOOST_AUTO_TEST_SUITE, поэтому их конструкторы будут вызываться при запуске набора, а их деструкторы будут вызываться сразу после завершения последнего соответствующего BOOST_AUTO_TEST_CASE.

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


person Alek86    schedule 14.12.2011    source источник
comment
Это тестовое устройство входа/выхода описано здесь: boost.org/doc/libs/1_70_0/libs/test/doc/html/boost_test/   -  person Raffi    schedule 01.06.2019


Ответы (4)


Для дальнейшего использования:

Это было добавлено в библиотеку, по-моему, начиная с 1.36.

person Sveltely    schedule 01.04.2014

Я не совсем уверен, что принятый ответ правильный, потому что если я использую тестовый код с сайта Boost:

#define BOOST_TEST_MODULE example
#include <boost/test/included/unit_test.hpp>

struct F {
    F() : i( 0 ) { BOOST_TEST_MESSAGE( "setup fixture" ); }
    ~F()         { BOOST_TEST_MESSAGE( "teardown fixture" ); }

    int i;
};

//____________________________________________________________________________//

BOOST_FIXTURE_TEST_SUITE( s, F )

BOOST_AUTO_TEST_CASE( test_case1 )
{
    BOOST_CHECK( i == 1 );
}

//____________________________________________________________________________//

BOOST_AUTO_TEST_CASE( test_case2 )
{
    BOOST_CHECK_EQUAL( i, 0 );
}

//____________________________________________________________________________//

BOOST_AUTO_TEST_SUITE_END()      

Тогда ожидаемая последовательность вызовов должна быть:

setup fixture
test_case1
test_case2
teardown fixture

А на самом деле это так:

setup fixture
test_case1
teardown fixture
setup fixture
test_case2
teardown fixture

Я не знаю, является ли это ошибкой, потому что, прочитав документацию BOOST_FIXTURE_TEST_SUITE, я бы ожидал именно первого поведения. Я также могу получить второе поведение, если использую BOOST_FIXTURE_TEST_CASE.

person DaRich    schedule 09.01.2015
comment
Точно мои мысли.. Похоже, что документация в данном случае вводит в заблуждение. Я хотел бы знать, если кто-нибудь нашел решение для этого. - person poli_g; 21.07.2016

Вы можете использовать глобальные фикстуры: http://www.boost.org/doc/libs/1_66_0/libs/test/doc/html/boost_test/tests_organization/fixtures/global.html

просто заменить

BOOST_FIXTURE_TEST_SUITE( s, F )
BOOST_AUTO_TEST_CASE( test_case1 )
[...]
BOOST_AUTO_TEST_SUITE_END()

с

BOOST_TEST_GLOBAL_FIXTURE( F );
BOOST_AUTO_TEST_CASE( test_case1 )
[...]

Тогда он будет работать так, как вы ожидаете.

-- sym39

person sym39    schedule 12.01.2018

Я не думаю, что это возможно с библиотекой Boost Test. Глобальные фикстуры на самом деле глобальны, т. е. они создаются для каждого запуска теста, а не для каждого набора.

Кроме того, я думаю, что такая установка нарушила бы принципы изоляции тестов. Можете ли вы объяснить, почему вам нужны «глобальные» переменные в области набора?

person Andre    schedule 14.12.2011
comment
изначально я думал, что мне это понадобится, чтобы открыть соединение с моей БД и закрыть его как можно быстрее. но после некоторого размышления я начинаю верить, что мне не нужно так быстро закрывать его... Или просто открывать-закрывать для каждого случая, а не весь набор - person Alek86; 15.12.2011
comment
Почему бы не повторно инициализировать/очистить после каждого теста? Для этого вы можете использовать приспособление набора и поместить свой код инициализации/очистки в конструктор/деструктор, поскольку каждый тестовый пример будет получен из приспособления набора, вы можете гарантировать, что каждый тестовый пример начинается с известного состояния. - person mark; 17.12.2011