2011-12-14 4 views
3

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

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

ответ

1

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

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

+0

изначально я думал, что это нужно, чтобы открыть соединение с моей БД и закрыть его как можно быстрее. но после некоторого времени размышления я начинаю верить, что мне не нужно так быстро его закрывать ... Или просто открывать-закрывать для каждого случая, а не весь набор – Alek86

+0

Почему бы не повторно инициализировать/очистить после каждого теста? Вы можете использовать набор инструментов для этого и поместить свой код init/cleardown в конструктор/деструктор, так как каждый тестовый пример будет получен из набора инструментов, который вы можете обеспечить, чтобы каждый тестовый пример начинался с известного состояния. – mark

2

Я не совсем уверен, что если принятый ответ правильный, потому что, если я использую тестовый код с подталкивание веб-сайта (http://www.boost.org/doc/libs/1_57_0/libs/test/doc/html/utf/user-guide/fixture/test-suite-shared.html)

#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 

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

+0

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

0

Вы можете использовать глобальные светильники: 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