![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Test suiteBoost , Boost.Test , Declaring and organizing tests
|
Код |
---|
<#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
>.
Код |
---|
<#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> |
Чтобы создать тестовый пакет вручную, вам нужно
boost::unit_test::test_suite
>Для того, чтобы создатьВ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 |
---|---|
Будьте осторожны при поставке ряда ожидаемых отказов для тестовых наборов. По умолчаниюUnit Test Frameworkвычисляет количество ожидаемых отказов в тестовом наборе как сумму соответствующих значений во всех тестовых блоках, которые его составляют. И редко имеет смысл это менять. |
Третий необязательный параметр -<timeout
>- определяет значение тайм-аута для испытательного блока. На данный моментUnit Test Frameworkне может установить тайм-аут для выполнения тестового набора, поэтому этот параметр имеет смысл только для регистрации тестового случая. По умолчанию тайм-аут не устанавливается. См. метод<boost::execution_monitor::execute
>для более подробной информации о тайм-ауте.
![]() |
Warning |
---|---|
Является ли эталон хорошим? Мне кажется, что< |
Для регистрации группы тестовых блоков в одном вызове функции класс<test_suite
>предоставляет другой интерфейс<add
>, описанный в расширенном разделе этой документации.
Чтобы создать экземпляр тестового набора вручную, используйте макрос<BOOST_TEST_SUITE
>. Он скрывает все детали реализации, и вам нужно только указать название тестового набора:
BOOST_TEST_SUITE(test_suite_name);
<BOOST_TEST_SUITE
>создает экземпляр класса<boost::unit_test::test_suite
>и возвращает указатель на построенный экземпляр. В качестве альтернативы вы можете создать экземпляр класса<boost::unit_test::test_suite
>самостоятельно.
![]() |
Caution |
---|---|
< |
Недавно созданный тестовый пакет должен быть зарегистрирован в родительском, используя дополнительный интерфейс. Создание и регистрация тестового набора выполняется в функции инициализации тестового модуля.
Приведенный ниже пример создает тестовое дерево, которое может быть представлено следующей иерархией:
Код |
---|
<#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> |
Статья Test suite раздела Boost.Test Declaring and organizing tests может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Declaring and organizing tests ::
реклама |