Я использую 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?
Аналогичный вопрос был задан Вот но я не мог найти ответ, который мог бы использовать.
На всякий случай, если кому-то будет полезно, просматривая исходные файлы 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
Дайте мне знать, если вы думаете, что у этого подхода есть недостатки, или если вы чувствуете, что есть лучший метод для достижения того, чего я хочу.
Других решений пока нет …