![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Template test casesBoost , Boost.Test , Test cases
|
Код |
---|
<#defineBOOST_TEST_MODULEexample #include<boost/test/included/unit_test.hpp> #include<boost/mpl/list.hpp> typedefboost::mpl::list<int,long,unsignedchar>test_types; BOOST_AUTO_TEST_CASE_TEMPLATE(my_test,T,test_types) { BOOST_TEST(sizeof(T)==(unsigned)4); }> |
выход |
---|
<>example Running3testcases... test.cpp(17):error:in"my_test<unsigned char>":checksizeof(T)==(unsigned)4hasfailed[1!=4] ***1failureisdetectedinthetestmodule"example"> |
Один из способов выполнения одного и того же набора проверок для компонента, инстанцированного с различными параметрами шаблона, проиллюстрирован в следующем примере:
template <typename T> void single_test() { BOOST_CHECK( /* test assertion */ ); } void combined_test() { single_test<int>(); single_test<float>(); single_test<unsigned char>(); }
Существует несколько проблем/неудобств с вышеуказанным подходом, в том числе:
В идеале шаблон тестового случая будет основан на шаблоне нулевой функции (например, Single_test выше). К сожалению, шаблоны функций не являются адресными и не могут использоваться в качестве параметров шаблона. Чтобы облегчить проблему, вручную зарегистрированный шаблон тестового случая состоит из двух совместно работающих макросов:<BOOST_TEST_CASE_TEMPLATE_FUNCTION
>и<BOOST_TEST_CASE_TEMPLATE
>. Прежний используется для определения шаблона тестового корпуса, позже — для создания и регистрации тестовых корпусов на его основе.
Макро<BOOST_TEST_CASE_TEMPLATE_FUNCTION
>требует двух аргументов:
BOOST_TEST_CASE_TEMPLATE_FUNCTION(test_case_name, type_name);
BOOST_TEST_CASE_TEMPLATE_FUNCTION( test_case_name, type_name ) { // test case template body }
Макро<BOOST_TEST_CASE_TEMPLATE_FUNCTION
>предназначено для использования вместо подписи шаблона нулевой функции:
template <typename type_name> void test_case_name() { // test case template body }
Разница только в том, что<BOOST_TEST_CASE_TEMPLATE_FUNCTION
>делает имя шаблона тестового примера пригодным для использования в списке аргументов шаблона.
<BOOST_TEST_CASE_TEMPLATE
>требует двух аргументов:
Имена, переданные обоим макросам, должны быть одинаковыми.
BOOST_TEST_CASE_TEMPLATE(test_case_name, collection_of_types);
<BOOST_TEST_CASE_TEMPLATE
>создает экземпляр генератора тестового корпуса. При переходе к способу<test_suite::add
>генератор производит отдельный подтест для каждого типа в поставляемом наборе типов и регистрирует его сразу в тестовом наборе. Каждый тест-кейс основан на шаблоне тест-кейса, созданном с конкретным типом теста.
Названияподтестовых случаеввыводятся из макроаргумента<test_case_name
>. Если вы предпочитаете назначать разные имена тестовых случаев, вам нужно использовать базовый интерфейс<make_test_case
>. Создание и регистрация тестовых случаев выполняется в функции инициализации тестового модуля.
![]() |
Tip |
---|---|
Средство шаблона тестового случая предпочтительнее подхода, приведенного в примере выше, поскольку выполнение каждого подтестового случая охраняется и учитывается отдельно. Он дает лучший журнал тестов / отчет о результатах (в примере выше в случае отказа вы не можете сказать, какой тип виноват) и позволяет тестировать все типы, даже если один из них вызывает прекращение подтеста. |
Код |
---|
<#include<boost/test/included/unit_test.hpp> #include<boost/mpl/list.hpp> usingnamespaceboost::unit_test; BOOST_TEST_CASE_TEMPLATE_FUNCTION(my_test,T) { BOOST_TEST(sizeof(T)==4U); } test_suite*init_unit_test_suite(int/*argc*/,char*/*argv*/[]) { typedefboost::mpl::list<int,long,unsignedchar>test_types; framework::master_test_suite(). add(BOOST_TEST_CASE_TEMPLATE(my_test,test_types)); return0; }> |
выход |
---|
<>example Running3testcases... test.cpp(15):error:in"my_test<unsigned char>":checksizeof(T)==4Uhasfailed[1!=4] ***1failureisdetectedinthetestmodule"Master Test Suite"> |
Статья Template test cases раздела Boost.Test Test cases может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Test cases ::
реклама |