Можно ли инициализировать прибор только один раз и использовать его в нескольких тестовых случаях?

Можно ли инициализировать прибор только один раз и использовать его в нескольких тестовых случаях в одном и том же тестовом наборе? В следующем примере прибор строится и разрушается несколько раз:

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()

Но я хочу, чтобы прибор был построен только однажды как набор тестов начинается и распределяется среди всех тестовых случаев в нем. Является ли это возможным? Деструктор вызывается после выхода из набора тестов.
Я использую Boost Test Framework, но у меня нет проблем с использованием других сред, таких как UnitTest ++.

7

Решение

Каждый тестовый пример получен из фикстуры Test Suite, которая создается в начале каждого тестового примера и уничтожается при его завершении (в вашем случае оба test_case1 & test_case2 получены из F ). Устройство настраивает и очищает среду для каждого отдельного теста.

Для модульного тестирования это, как правило, предпочтительная стратегия — каждый контрольный пример является отдельным и полностью атомарным.

В некоторых сценариях (например, интеграционное тестирование) может быть предпочтительным один раз приобрести дорогостоящий ресурс и удерживать его в течение более все контрольные примеры. Это можно сделать с помощью GLOBAL FIXTURE, который создается в начале тестового прогона и разрушается при выходе из теста.

Если для каких-либо тестовых случаев требуется другая настройка / конфигурация глобальных ресурсов, то использовать ГЛОБАЛЬНОЕ ИСПРАВЛЕНИЕ нельзя, и вам следует пересмотреть свою стратегию тестирования, чтобы каждый тестовый сценарий конфигурировал и очищал свою собственную среду.

К сожалению, тестовые случаи не имеют прямого доступа к глобальному тестовому устройству, поэтому вам потребуется предоставить механизм, который позволит им получить доступ к ресурсу (например, через глобальную переменную или синглтон).

В приведенном ниже примере MyFixture это синглтон, который содержит ресурс.
например

struct MyFixture
{
static MyFixture*& instance() { static MyFixture* s_inst = 0;
return s_inst; }

MyFixture()
{
instance() = this;
x = 10;
BOOST_TEST_MESSAGE( "setup fixture" );
}

~MyFixture()
{
BOOST_TEST_MESSAGE( "teardown fixture" );
}

int x;
};

BOOST_GLOBAL_FIXTURE(MyFixture)BOOST_AUTO_TEST_CASE(TEST_1)
{
BOOST_CHECK(MyFixture::instance()->x == 10);
MyFixture::instance()->x = 12;
}
BOOST_AUTO_TEST_CASE(TEST_2)
{
BOOST_CHECK(MyFixture::instance()->x == 12);
}
20

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector