Как пропустить BOOST unit test?

Как я могу пропустить BOOST unit test? Я хотел бы программно пропустить некоторые из моих модульных тестов в зависимости от (например) платформы, на которой я их выполняю. Мое текущее решение:

#define REQUIRE_LINUX char * os_cpu = getenv("OS_CPU"); if ( os_cpu != "Linux-x86_64" ) return;

BOOST_AUTO_TEST_CASE(onlylinux) {
    REQUIRE_LINUX
    ...
    the rest of the test code.
}

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

Как я могу с легкостью пропустить тесты модульных модулей на основе произвольной логики?

Ответ 1

Вместо того, чтобы пропустить их, вы можете предотвратить их регистрацию. Для этого вы можете использовать ручную проверку теста boost.test:

#include <boost/test/included/unit_test.hpp>
using namespace boost::unit_test;

//____________________________________________________________________________//

void only_linux_test()
{
    ...
}

//____________________________________________________________________________//

test_suite*
init_unit_test_suite( int argc, char* argv[] ) 
{
    if(/* is linux */)
        framework::master_test_suite().
            add( BOOST_TEST_CASE( &only_linux_test ) );

    return 0;
}

Подробнее о http://www.boost.org/doc/libs/1_53_0/libs/test/doc/html/utf/user-guide/test-organization/manual-nullary-test-case.html

Другой возможностью было бы использовать #ifdef... #endif с BOOST_AUTO_TEST_CASE. Для вас требуется определение, которое определено, если вы компилируете код на целевой платформе.

#ifdef PLATFORM_IS_LINUX

BOOST_AUTO_TEST_CASE(onlyLinux)
{
    ...
}
#endif

Это определение может быть, например, задано вашей средой сборки.

Ответ 2

Используйте декораторы enable_if/enable/precondition.

boost::test_tools::assertion_result is_linux(boost::unit_test::test_unit_id)
{
  return isLinux;
}


BOOST_AUTO_TEST_SUITE(MyTestSuite)

BOOST_AUTO_TEST_CASE(MyTestCase,
                     * boost::unit_test::precondition(is_linux))
{...}

precondition оценивается во время выполнения, включается, enable_if во время компиляции.

Смотрите: http://www.boost.org/doc/libs/1_61_0/libs/test/doc/html/boost_test/tests_organization/enabling.html

Ответ 3

Регистрация тестовых случаев вручную является утомительной, скучной и подверженной ошибкам. Если только на платформе вам нужно различать тестовые примеры, я просто не буду компилировать нерелевантные тестовые примеры на платформах, где это не имеет значения, настроив мою систему сборки. В качестве альтернативы вы можете использовать Boost.Predef, который определяет необходимые символы препроцессора для всего, что вы можете знать о ОС, компиляторе и т.д., Которые будут вы можете #ifdef выполнить определенные тесты.

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