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

Test suite

Boost , Boost.Test , Declaring and organizing tests

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

Если рассматривать тестовые кейсы как листья на тест-дереве, тестовый набор можно рассматривать как ветвь, а главный тестовый набор — как корень. В отличие от настоящих деревьев, наше дерево во многих случаях состоит только из листьев, прикрепленных непосредственно к корню. Это характерно для всех тестовых случаев, которые находятся непосредственно в мастер-тесте. Если вы хотите построить иерархическую структуру набора тестовЕдиная тестовая системаобеспечивает как ручное, так и автоматизированное создание и регистрацию тестовых наборов:

  1. Тестовый пакет с автоматической регистрацией
  2. Ручно зарегистрированный набор тестов

Кроме того,Единичная система тестированияпредставляет собой представление омастер тест-люкс. Самая важная причина, чтобы узнать об этом компоненте, заключается в том, что он обеспечивает возможность доступа к аргументам командной строки, поставляемым в тестовый модуль.

Automated registration

РешениеЕдиничная система испытаний, предназначенная для создания и регистрации автоматизированных тестовых наборов, предназначена для облегчения множества точек определения, произвольной глубины тестовых наборов и плавной интеграции с автоматизированным созданием и регистрацией тестовых наборов. Этот объект должен значительно упростить процесс строительства тестового дерева по сравнению с ручной регистрацией.

Реализация основана на порядке определений переменных объема файла в пределах одного блока компиляции. Семантика этого средства очень похожа на функцию пространства имен C++, включая поддержку расширения набора тестов. Для запуска тестового набора используйте макрос<BOOST_AUTO_TEST_SUITE>. Для завершения тестового набора используйте макрос<BOOST_AUTO_TEST_SUITE_END>. Один и тот же набор тестов может быть перезапущен несколько раз внутри одного и того же тестового файла или в разных тестовых файлах. В результате все испытательные блоки будут частью одного и того же набора тестов в построенном испытательном дереве.

BOOST_AUTO_TEST_SUITE(test_suite_name);
BOOST_AUTO_TEST_SUITE_END();

Тестовые единицы, определенные между начальной и конечной декларацией тестового набора, становятся членами тестового набора. Тестовый блок всегда становится членом ближайшего тестового набора. Тестовые единицы, объявленные в области тестовых файлов, становятся членами основного набора тестов. Нет ограничений на глубину включения тестового набора.

Этот пример создает тестовое дерево, которое точно соответствует тому, которое создано в ручном примере регистрации тестового набора.

Example: Test suites with automated registration

Код

<
#defineBOOST_TEST_MODULEexample
#include<boost/test/included/unit_test.hpp>
BOOST_AUTO_TEST_SUITE(test_suite1)
BOOST_AUTO_TEST_CASE(test_case1)
{
 BOOST_TEST_WARN(sizeof(int)<4U);
}
BOOST_AUTO_TEST_CASE(test_case2)
{
 BOOST_TEST_REQUIRE(1==2);
 BOOST_FAIL("Should never reach this line");
}
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_SUITE(test_suite2)
BOOST_AUTO_TEST_CASE(test_case3)
{
 BOOST_TEST(true);
}
BOOST_AUTO_TEST_CASE(test_case4)
{
 BOOST_TEST(false);
}
BOOST_AUTO_TEST_SUITE_END()
>

выход

<
>example
Running4testcases...
test.cpp(21):fatalerror:in"test_suite1/test_case2":criticalcheck1==2hasfailed[1!=2]
test.cpp(35):error:in"test_suite2/test_case4":checkfalsehasfailed
***2failuresaredetectedinthetestmodule"example"
>

Как вы можете видеть, конструкция тестового дерева в этом примере более проста и автоматизирована.

В приведенном ниже примере тестовый набор<test_suite>состоит из двух частей. Их определение является отдалённым и разделяется другим тестовым случаем. На самом деле эти части могут даже находиться в различных тестовых файлах. Полученное тест-дерево осталось прежним. Как видно из вывода, и<test_case1>, и<test_case2>находятся в одном и том же тестовом наборе<test_suite>.

Example: Test suite extension using automated registration facility

Код

<
#defineBOOST_TEST_MODULEexample
#include<boost/test/included/unit_test.hpp>
BOOST_AUTO_TEST_SUITE(test_suite)
BOOST_AUTO_TEST_CASE(test_case1)
{
 BOOST_ERROR("some error 1");
}
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(test_case_on_file_scope)
{
 BOOST_TEST(true);
}
BOOST_AUTO_TEST_SUITE(test_suite)
BOOST_AUTO_TEST_CASE(test_case2)
{
 BOOST_ERROR("some error 2");
}
BOOST_AUTO_TEST_SUITE_END()
>

выход

<
>example--report_level=detailed
Running3testcases...
test.cpp(8):errorin"test_case1":someerror1
test.cpp(23):errorin"test_case2":someerror2
Testsuite"example"failedwith:
 1assertionoutof3passed
 2assertionsoutof3failed
 1testcaseoutof3passed
 2testcasesoutof3failed
 Testsuite"test_suite"failedwith:
   2assertionsoutof2failed
   2testcasesoutof2failed
   Testcase"test_case1"failedwith:
     1assertionoutof1failed
   Testcase"test_case2"failedwith:
     1assertionoutof1failed
 Testcase"test_case_on_file_scope"passedwith:
   1assertionoutof1passed
>

Test suites with manual registration

Чтобы создать тестовый пакет вручную, вам нужно

  1. <boost::unit_test::test_suite>Для того, чтобы создать
  2. Зарегистрируйте его на тестовом дереве.
  3. Заполните его тестовыми кейсами (или тестовыми наборами более низкого уровня).
Test unit registration interface

ВUnit Test Frameworkмоделируется понятие контейнера для тестовых корпусов - набора тестов - с использованием класса<boost::unit_test::test_suite>. Для полной проверки интерфейса класса проверьте расширенный раздел этой документации. Здесь вам будет интересен только один интерфейс регистрации тестового блока:

void test_suite::add( test_unit* tc, counter_t expected_failures = 0, int timeout = 0 );

Первый параметр — указатель на вновь созданный испытательный блок. Второй необязательный параметр - expected_failures - определяет количество тестовых утверждений, которые, как ожидается, потерпят неудачу в испытательном блоке. По умолчанию ошибок не ожидается.

[Caution] Caution

Будьте осторожны при поставке ряда ожидаемых отказов для тестовых наборов. По умолчаниюUnit Test Frameworkвычисляет количество ожидаемых отказов в тестовом наборе как сумму соответствующих значений во всех тестовых блоках, которые его составляют. И редко имеет смысл это менять.

Третий необязательный параметр -<timeout>- определяет значение тайм-аута для испытательного блока. На данный моментUnit Test Frameworkне может установить тайм-аут для выполнения тестового набора, поэтому этот параметр имеет смысл только для регистрации тестового случая. По умолчанию тайм-аут не устанавливается. См. метод<boost::execution_monitor::execute>для более подробной информации о тайм-ауте.

[Warning] Warning

Является ли эталон хорошим? Мне кажется, что<boost::unit_test::test_suite::add>лучше.

Для регистрации группы тестовых блоков в одном вызове функции класс<test_suite>предоставляет другой интерфейс<add>, описанный в расширенном разделе этой документации.

Test suite instance construction

Чтобы создать экземпляр тестового набора вручную, используйте макрос<BOOST_TEST_SUITE>. Он скрывает все детали реализации, и вам нужно только указать название тестового набора:

BOOST_TEST_SUITE(test_suite_name);

<BOOST_TEST_SUITE>создает экземпляр класса<boost::unit_test::test_suite>и возвращает указатель на построенный экземпляр. В качестве альтернативы вы можете создать экземпляр класса<boost::unit_test::test_suite>самостоятельно.

[Caution] Caution

<boost::unit_test::test_suite>экземпляры должны быть выделены на кучу, и компилятор не позволит вам создать один на стеке.

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

Приведенный ниже пример создает тестовое дерево, которое может быть представлено следующей иерархией:

Example: Manually registered test suites

Код

<
#include<boost/test/included/unit_test.hpp>
usingnamespaceboost::unit_test;
voidtest_case1(){/* ... */}
voidtest_case2(){/* ... */}
voidtest_case3(){/* ... */}
voidtest_case4(){/* ... */}
test_suite*init_unit_test_suite(int/*argc*/,char*/*argv*/[])
{
 test_suite*ts1=BOOST_TEST_SUITE("test_suite1");
 ts1->add(BOOST_TEST_CASE(&test_case1));
 ts1->add(BOOST_TEST_CASE(&test_case2));
 test_suite*ts2=BOOST_TEST_SUITE("test_suite2");
 ts2->add(BOOST_TEST_CASE(&test_case3));
 ts2->add(BOOST_TEST_CASE(&test_case4));
 framework::master_test_suite().add(ts1);
 framework::master_test_suite().add(ts2);
 return0;
}
>

выход

<
>example--log_level=test_suite
Running4testcases...
Enteringtestsuite"Master Test Suite"
Enteringtestsuite"test_suite1"
Enteringtestcase"test_case1"
Leavingtestcase"test_case1"
Enteringtestcase"test_case2"
Leavingtestcase"test_case2"
Leavingtestsuite"test_suite1"
Enteringtestsuite"test_suite2"
Enteringtestcase"test_case3"
Leavingtestcase"test_case3"
Enteringtestcase"test_case4"
Leavingtestcase"test_case4"
Leavingtestsuite"test_suite2"
Leavingtestsuite"Master Test Suite"
***Noerrorsdetected
>

PrevUpHomeNext

Статья Test suite раздела Boost.Test Declaring and organizing tests может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Declaring and organizing tests ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 01:19:57/0.0064079761505127/0