класс, BOOST_TEST_MODULE, BOOST_AUTO_TEST_SUITE: проблемы с именами?

Итак, я начал использовать буст-юнит-тестирование.
Когда я пытаюсь создать простой тест, который создает экземпляр класса, я получаю сообщение об ошибке компиляции. Он работает нормально без экземпляра класса.

Сообщение об ошибке компиляции:

/src/test/WTFomgFail_test.cpp: In member function ‘void WTFomgFail::defaultConstructor::test_method()’:
/src/test/WTFomgFail_test.cpp:20: error: expected primary-expression before ‘obj’
/src/test/WTFomgFail_test.cpp:20: error: expected `;' before ‘obj’

WTFomgFail_test.cpp:

#include "WTFomgFail.hpp"
#define BOOST_TEST_MODULE WTFomgFail
#define BOOST_TEST_MAIN
#define BOOST_TEST_DYN_LINK

#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(WTFomgFail)

BOOST_AUTO_TEST_CASE( defaultConstructor )
{
WTFomgFail obj = WTFomgFail();
BOOST_MESSAGE("wow, you did it");
}

BOOST_AUTO_TEST_SUITE_END()

WTFomgFail.hpp:

#ifndef WTFOMGFAIL_HPP_
#define WTFOMGFAIL_HPP_

class WTFomgFail
{
public:
WTFomgFail();
~WTFomgFail();
};

#endif /* WTFOMGFAIL_HPP_ */

WTFomgFail.cpp:

#include "WTFomgFail.hpp"
WTFomgFail::WTFomgFail()
{
}

WTFomgFail::~WTFomgFail()
{
}

Ошибка исчезнет, ​​если я изменю BOOST_AUTO_TEST_SUITE(WTFomgFail) скажи что-нибудь еще BOOST_AUTO_TEST_SUITE(OMGreally),

Кроме того, я не получаю ошибку при использовании #define BOOST_TEST_MODULE OMGreally с BOOST_AUTO_TEST_SUITE(OMGreally),

Итак, мой вопрос, когда при использовании UTF boost называет модуль, test_suite и class, то же самое явно запрещено?

3

Решение

Я знаю, что опоздал на этот вопрос, но я просто наткнулся на него, и это выглядело так одиноко …

Чтобы понять это ограничение, вы должны понимать, как Boost Tests первоначально работал. (Это все еще может работать таким образом, но тогда не было BOOST_AUTO_... макросы и ты имел сделать это так.)

От документы:

class test_class {
public:
void test_method1()
{
BOOST_CHECK( true /* test assertion */ );
}
void test_method2()
{
BOOST_CHECK( false /* test assertion */ );
}
};

//____________________________________________________________________________//

test_suite*
init_unit_test_suite( int argc, char* argv[] )
{
boost::shared_ptr<test_class> tester( new test_class );

framework::master_test_suite().
add( BOOST_TEST_CASE( boost::bind( &test_class::test_method1, tester )));
framework::master_test_suite().
add( BOOST_TEST_CASE( boost::bind( &test_class::test_method2, tester )));
return 0;
}

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

Вот почему они представили BOOST_AUTO_TEST_SUITE а также BOOST_AUTO_TEST_CASE, которые делают это для вас.

Параметр, который вы передаете BOOST_AUTO_TEST_SUITE это, конечно же, название класса (test_class выше). Параметр для BOOST_AUTO_TEST_CASE имя тестовой функции (test_method1() а также test_method2() выше).

Так что нет, они могут (конечно) не совпадать с классом и функциями, которые вы тестируете. Вы можете использовать пространства имен для этого, но лично я предпочитаю просто добавлять суффикс имени класса к Tu (или же _tu если вы не в названии CamelCase), и использовать его для набора тестов.

Надеюсь, это поможет.

5

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

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