Как пропустить 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
выполнить определенные тесты.
Наконец, если этот критерий может быть известен только во время выполнения и не зависит от платформы, на которой вы работаете, я бы сгруппировал тесты, которые зависят от конкретных критериев, в наборах и отредактировал командную строку, используемую строкой, чтобы запускать только эти сеты на основе критериев времени выполнения.
Ответ 4
BOOST_AUTO_TEST_CASE(a_test_name,
*boost::unit_test::disabled()
)
{
...
}