Здравствуйте, mdbset, Вы писали:
M>Как с использованием boost unit_test с помощью одного набора тестов протестировать несколько реализаций некоторого интерфейса?
Ну например, создать global fixture, содержащую код инициализации интерфейса конкретным классом
реализации, и использовать созданный объект полиморфно в тест-кейсах. А тип объекта задавать
всякими конфигурационными методами, такими как командная строка.
То есть:
// Абстрактный класс геометрической фигуры.
class figure
{
public:
virtual ~figure() {}
public:
virtual void draw() = 0;
virtual void shade_effect() = 0;
virtual void rotate() = 0;
};
// Конкретные реализации
class circle : public figure {...};
class triangle : public figure {...};
class rectangle : public figure {...};
// ...
// Определение global fixture (см. описание в Boost Unit Test Framework).
struct my_fixture
{
// setup
my_fixture()
{
// В зависимости от опций командной строки
// выбирается конкретная реализация figure.
switch (command_line_option)
{
case opt::circle:
pObject = new circle();
break;
case opt::triangle:
pObject = new triangle();
break;
case opt::rectangle:
pObject = new rectangle();
break;
default:
pObject = NULL;
break;
}
}
// teardown
~my_fixture()
{
delete pObject;
}
figure *pObject;
};
// ...
// Установка global fixture.
BOOST_GLOBAL_FIXTURE(my_fixture);
// Набор полиморфных тест-кейсов для figure.
BOOST_AUTO_TEST_CASE(draw_test)
{
pObject->draw();
}
BOOST_AUTO_TEST_CASE(shade_effect_test)
{
pObject->shade_effect();
}
BOOST_AUTO_TEST_CASE(rotate_test)
{
pObject->rotate();
}
Еще можно использовать BOOST_TEST_CASE_TEMPLATE, тогда конкретные типы figure
будут задаваться списком (Boost.MPL) в параметрах шаблона.