Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Parametrized test cases

Boost , Boost.Test , Test cases

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext
[Caution] 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 независимых тестовых случаев.

Example: Unary free function based test case

Код

<
#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"
>

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

Example: Unary class method based test case

Код

<
#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"
>

PrevUpHomeNext

Статья Parametrized test cases раздела Boost.Test Test cases может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Test cases ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 18:57:46/0.010140180587769/1