Boost Test вход / выход приспособления с ручной регистрацией

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

// testsuite.cpp
#include <boost/test/unit_test.hpp>
using boost::unit_test::test_suite;

test_suite* init_unit_test_suite(int, char* []) {
test_suite* test = BOOST_TEST_SUITE("TestSuiteName");
test->add(FooTest::suite());
return test;
}

// foo.hpp
#include <boost/test/unit_test.hpp>
using boost::unit_test::test_suite;

class FooTest {
public:
static void testFoo1();
static void testFoo2();
static test_suite* suite();
}

// foo.cpp
#include <foo.hpp>

void FooTest::testFoo1() {
// testFoo1 implementation
}
void FooTest::testFoo2() {
// testFoo2 implementation
}

test_suite* FooTest::suite() {
test_suite* suite = BOOST_TEST_SUITE("FooTest");
suite->add(BOOST_TEST_CASE(&FooTest::testFoo1));
suite->add(BOOST_TEST_CASE(&FooTest::testFoo2));
return suite;
}

Я хотел бы добавить прибор входа / выхода, как описано Вот, в набор тестов FooTest. В документации Boost Test эта функция описана в контексте автоматически зарегистрированных тестов.

Могу ли я использовать эту функцию фиксации входа / выхода с моей настройкой, где я вручную регистрирую тесты? Если нет, есть ли у кого-нибудь предложение о том, как я мог бы подражать этому поведению, то есть иметь построенный объект один раз при входе в набор тестов FooTest, доступный для всех тестов в наборе тестов и затем уничтоженный при выходе из набора FooTest?

Аналогичный вопрос был задан Вот но я не мог найти ответ, который мог бы использовать.

0

Решение

На всякий случай, если кому-то будет полезно, просматривая исходные файлы Boost Test, я обнаружил следующее, что, по-видимому, отвечает моим требованиям, то есть использование устройства входа / выхода с ручной регистрацией.

// testsuite.cpp
#include "foo.hpp"
#include <boost/test/unit_test.hpp>
using boost::unit_test::test_suite;

test_suite* init_unit_test_suite(int, char*[]) {
test_suite* test = BOOST_TEST_SUITE("TestSuiteName");
test->add(FooTest::suite());
return test;
}

// bar.hpp (The class to be tested)
class Bar {
public:
Bar(int x, int y) : x_(x), y_(y) {}

int x_;
int y_;
};

// foo.hpp
#include <boost/test/unit_test.hpp>
using boost::unit_test::test_suite;

class FooTest {
public:
static void testFoo1();
static void testFoo2();
static test_suite* suite();
};

// foo.cpp
#include "foo.hpp"#include "bar.hpp"
#include <boost/make_shared.hpp>

#include <vector>

using boost::unit_test::test_unit_fixture_ptr;
using std::vector;

namespace {
boost::shared_ptr<Bar> bar;

void setup() {
BOOST_TEST_MESSAGE("Creating Bar Instance");
bar = boost::make_shared<Bar>(1, 2);
}

void teardown() {
BOOST_TEST_MESSAGE("Destroying Bar Instance");
bar.reset();
}
}

void FooTest::testFoo1() {
BOOST_TEST_MESSAGE("In testFoo1");
BOOST_CHECK_MESSAGE(bar->x_ == 1, "Checking x_");
}
void FooTest::testFoo2() {
BOOST_TEST_MESSAGE("In testFoo2");
BOOST_CHECK_MESSAGE(bar->y_ == 2, "Checking y_");
}

test_suite* FooTest::suite() {
test_suite* suite = BOOST_TEST_SUITE("FooTest");

// Manually add an entry/exit fixture to the test suite
vector<test_unit_fixture_ptr> fixtures {
boost::make_shared<boost::unit_test::function_based_fixture>(setup, teardown)};
suite->p_fixtures.set(fixtures);

suite->add(BOOST_TEST_CASE(&FooTest::testFoo1));
suite->add(BOOST_TEST_CASE(&FooTest::testFoo2));
return suite;
}

Этот код дает следующий вывод при запуске с log_level=message

 Running 2 test cases...
Creating Bar Instance
In testFoo1
In testFoo2
Destroying Bar Instance

*** No errors detected

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

0

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

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

По вопросам рекламы [email protected]