2013-06-04 4 views
11

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

#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). Это кажется уродливым и подверженным ошибкам, а также как бесшумные пропуски могут заставить пользователей пропускать тесты, не зная об этом.

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

ответ

2

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

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

+0

Я не могу использовать ifdefs, некоторые из этих критериев должны быть определить, на выполнение времени. Спасибо, я, вероятно, воспользуюсь чем-то вроде вашего предложения о регистрации. – dbn

3

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

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

4

Используйте декораторы 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)) 
{...} 

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

См: http://www.boost.org/doc/libs/1_61_0/libs/test/doc/html/boost_test/tests_organization/enabling.html

+0

Отлично! Это именно то, что я искал (назад в день). Я проверю это с помощью нескольких наших тестов. – dbn

+0

@Horus, Есть ли способ использовать прибор в предварительном условии? – mojo

+0

@mojo Вы можете посмотреть мой код https://github.com/precice/precice/blob/develop/src/testing/Testing.hpp. Я использую декоратор для удаления тестов из тестового дерева, он может работать и для светильников. Имейте в виду, что мой код, вероятно, использует неофициальный API повышения. – Horus

1

BOOST_AUTO_TEST_CASE(a_test_name,*boost::unit_test::disabled())

{ 
    ... 
} 
+0

Я не нашел этот второй параметр в документации, вы уверены, что он доступен? – moodboom

+0

полностью да http: //www.boost. – Sergei

+0

Прохладно, спасибо, и теперь я вижу, что ваш второй параметр был фактически ссылкой на документы, док-листы. – moodboom

Смежные вопросы