2016-08-06 16 views
0

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

// 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; 
} 

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

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

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

ответ

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

Не хотите ли, чтобы экземпляры «Бар» были созданы и уничтожены для каждого теста? Таким образом, ваш тест не работает изолированно. – ToniBig

+0

Хорошо сегодня, я не вижу веских причин для использования ручной проверки теста. Я также считаю, что регистрация теста может быть смешана внутри одного тестового модуля: ручная + автоматическая должна быть способна сосуществовать в тестовом модуле. В вашем случае вы можете использовать автоматическую регистрацию для класса 'FooTest' (также' test_unit_fixture_ptr' и 'p_fixtures' официально не документированы и должны быть частным API). – Raffi