![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Parametrized test casesBoost , Boost.Test , Test cases
|
![]() |
Caution |
---|---|
функциональные возможности, представленные на этой странице, были заменены тест-кейсом, управляемым данными. |
Некоторые тесты необходимо повторить для ряда различных входных параметров. Одним из способов достижения этого является ручная регистрация тестового случая для каждого параметра, как в предыдущих примерах. Вы также можете вызвать функцию тестирования со всеми параметрами вручную из вашего тестового случая, например:
void single_test( int i ) { BOOST_CHECK( /* test assertion */ ); } void combined_test() { int params[] = { 1, 2, 3, 4, 5 }; std::for_each( params, params+5, &single_test ); }
Единичная система тестированияпредставляет лучшее решение этой проблемы: тест-кейс на основе унарной функции, также называемыйпараметризированным тест-кейсом.. Унарная тестовая функция может представлять собой свободную функцию, унарный функтор (например, созданный с помощью<boost::bind
>) или унарный метод класса со связанным экземпляром тестового класса. Функция тестирования преобразуется в тестовый случай с использованием макроса<BOOST_PARAM_TEST_CASE
>. Макро ожидает набор параметров (пройденных как два входных итератора) и унарную функцию тестирования:
BOOST_PARAM_TEST_CASE(test_function, params_begin, params_end);
<BOOST_PARAM_TEST_CASE
>создает экземпляр генератора тестового корпуса. При переходе к способу<test_suite::add
>генератор производит отдельный подтест для каждого параметра в наборе параметров и регистрирует его сразу в наборе тестов. Каждый тестовый случай основан на тестовой функции с параметром, связанным значением, даже если тестовая функция ожидает параметр по ссылке. Тот факт, что значение параметра сохраняется вместе с связанной функцией тестирования, освобождает вас от необходимости управлять временем жизни параметров. Например, они могут быть определены в области функции инициализации тестового модуля.
Все подиспытательные примеры выводятся из макроаргумента<test_function
>. Если вы предпочитаете назначать разные имена, вы должны использовать базовый интерфейс<make_test_case
>. Создание и регистрация тестовых случаев выполняются в функции инициализации тестового модуля.
Параметризированный испытательный стенд предпочтительнее подхода, описанного в приведенном выше примере, поскольку выполнение каждого испытательного стенда охраняется и учитывается независимо. Он дает лучший отчет о результатах теста (в примере выше в случае сбоя вы не можете сказать, какой параметр неисправен) и позволяет протестировать все параметры, даже если один из них вызывает прекращение конкретного теста.
По сравнению с ручной регистрацией тестового случая для каждого параметра, параметризированный испытательный корпус является более лаконичным и легко расширяемым.
В следующем простом примере тот же тест, реализованный в<free_test_function
>, выполняется по 5 различным параметрам. Параметры определены в области функции инициализации испытательного модуля. Мастер-тест содержит 5 независимых тестовых случаев.
Код |
---|
<#include<boost/test/included/unit_test.hpp> #include<boost/test/parameterized_test.hpp> usingnamespaceboost::unit_test; voidfree_test_function(inti) { BOOST_TEST(i<4/* test assertion */); } test_suite*init_unit_test_suite(int/*argc*/,char*/*argv*/[]) { intparams[]={1,2,3,4,5}; framework::master_test_suite(). add(BOOST_PARAM_TEST_CASE(&free_test_function,params,params+5)); return0; }> |
выход |
---|
<>example Running5testcases... test.cpp(15):error:in"free_test_function":checki<4hasfailed[4>=4] test.cpp(15):error:in"free_test_function":checki<4hasfailed[5>=4] ***2failuresaredetectedinthetestmodule"Master Test Suite"> |
Следующий пример похож, но вместо свободной функции он использует метод класса. Несмотря на то, что параметры передаются в метод тестирования по ссылке, вы все равно можете определить их в области функции инициализации тестового модуля. В этом примере используется альтернативная спецификация функции инициализации тестового модуля.
Код |
---|
<#defineBOOST_TEST_ALTERNATIVE_INIT_API #include<boost/test/included/unit_test.hpp> #include<boost/test/floating_point_comparison.hpp> #include<boost/test/parameterized_test.hpp> #include<boost/bind.hpp> usingnamespaceboost::unit_test; namespacett=boost::test_tools; usingnamespaceboost; classtest_class{ public: voidtest_method(doubled) { BOOST_TEST(d*100==(double)(int)(d*100),tt::tolerance(0.0001)); } }tester; boolinit_unit_test() { doubleparams[]={1.,1.1,1.01,1.001,1.0001}; boost::function<void(double)>test_method=bind(&test_class::test_method,&tester,_1); framework::master_test_suite(). add(BOOST_PARAM_TEST_CASE(test_method,params,params+5)); returntrue; }> |
выход |
---|
<>example Running5testcases... test.cpp(23):error:in"test_method":checkd*100==(double)(int)(d*100)hasfailed[1.0001*100!=100].Relativedifferenceexceedstolerance[0.001>0.0001] test.cpp(23):error:in"test_method":checkd*100==(double)(int)(d*100)hasfailed[1.0001*100!=100].Relativedifferenceexceedstolerance[0.0001>0.0001] ***2failuresaredetectedinthetestmodule"Master Test Suite"> |
Статья Parametrized test cases раздела Boost.Test Test cases может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Test cases ::
реклама |