![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Test unit filteringBoost , Boost.Test , Runtime parameters
|
Код |
---|
<#defineBOOST_TEST_MODULEdecorator_20 #include<boost/test/included/unit_test.hpp> namespaceutf=boost::unit_test; constboolio_implemented=true; constbooldb_implemented=false; BOOST_AUTO_TEST_SUITE(suite1,*utf::disabled()) BOOST_AUTO_TEST_CASE(test_1) { BOOST_TEST(1!=1); } BOOST_AUTO_TEST_CASE(test_2,*utf::enabled()) { BOOST_TEST(2!=2); } BOOST_AUTO_TEST_CASE(test_io, *utf::enable_if<io_implemented>()) { BOOST_TEST(3!=3); } BOOST_AUTO_TEST_CASE(test_db, *utf::enable_if<db_implemented>()) { BOOST_TEST(4!=4); } BOOST_AUTO_TEST_SUITE_END()> |
выход |
---|
<>decorator_20 Running2testcases... test.cpp(18):error:in"suite1/test_2":check2!=2hasfailed[2==2] test.cpp(24):error:in"suite1/test_io":check3!=3hasfailed[3==3] ***2failuresaredetectedinthetestmodule"decorator_20" >decorator_20--list_content suite1* test_1 test_2* test_io* test_db> |
Кроме того, можно статически связать испытательный блок с условием. Это связанное состояние оценивается непосредственно перед выполнением тест-блока. Если условие выполнено, тестовый блок выполняется. В противном случае испытательный блокпропущен. Можно добавить две зависимости:
depends_on
>.precondition
>.Статическая конфигурация фильтрации тестового корпуса используется по умолчанию, если не применяется фильтрация командной строки. С помощью аргумента командной строки<run_test
>можно изменить статическую предустановку несколькими способами:
Термин «абсолютный» в этом контексте означает, что статус запуска тестовых блоков по умолчанию, который был статически настроен, полностью игнорируется, а тесты, которые должны быть запущены, указаны вручную с нуля. Во-первых, чтобы узнать, какие тестовые блоки зарегистрированы в тестовом дереве, пользователю необходимо использовать аргумент командной строки<list_content
>. Далее, чтобы указать набор тестовых случаев, пользователю необходимо использовать аргумент командной строки<run_test
>с абсолютным значением:
> test_program --run_test
=<test_set>
Формат<<test_set>
>значения может принимать ряд форм. Учитывая следующую программу:
#defineBOOST_TEST_MODULE
example #include <boost/test/included/unit_test.hpp> using boost::unit_test::label
;BOOST_AUTO_TEST_CASE
(test_1, *label("L1")) {} BOOST_AUTO_TEST_CASE(test_2, *label("L1")) {}BOOST_AUTO_TEST_SUITE
(suite_1) BOOST_AUTO_TEST_SUITE(suite_1) BOOST_AUTO_TEST_CASE(test_1) {} BOOST_AUTO_TEST_CASE(test_2) {} BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE(suite_2) BOOST_AUTO_TEST_CASE(test_1, *label("L2")) {} BOOST_AUTO_TEST_CASE(test_2, *label("L2")) {} BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_CASE(test_1, *label("L1")) {} BOOST_AUTO_TEST_CASE(test_2) {} BOOST_AUTO_TEST_CASE(test_2A) {} BOOST_AUTO_TEST_SUITE_END()
Следующая таблица иллюстрирует, как различные значения<<test_set>
>контролируют, какие тестовые случаи выполняются.
Описание |
Значение параметра |
Тестовые случаи |
---|---|---|
Запуск одного теста верхнего уровня по имени |
< > |
<test_1> |
Запуск одного вложенного тест-кейса по имени |
< > |
<suite_1/suite_1/test_1> |
Запуск одноместного тестового набора по имени |
<> |
<suite_1/suite_2/test_1 suite_1/suite_2/test_2> |
Запуск нескольких испытательных блоков, которые являютсябратьями и сестрамитого же набора тестов |
< > |
<suite_1/suite_2/test_1 suite_1/suite_2/test_2 suite_1/test_1> |
Запуск нескольких тестовых блоков, которые не обязательно являются братьями и сестрами |
< > |
<suite_1/test_1 test_1> |
Проведите все тесты, соответствующие заданной этикетке |
< > |
<test_1 test_2 suite_1/test_1> |
Проведите каждый тест на дереве |
< > |
<test_1 test_2 suite_1/suite_1/test_1 suite_1/suite_1/test_2 suite_1/suite_2/test_1 suite_1/suite_2/test_2 suite_1/test_1 suite_1/test_2 suite_1/test_2A> |
Запуск каждого тестового блока в заданном наборе с заданным префиксом |
< > |
<suite_1/test_1 suite_1/test_2 suite_1/test_2A> |
Запуск каждого тестового блока в заданном наборе с заданным суффиксом |
< > |
<suite_1/suite_1/test_1 suite_1/suite_1/test_2 suite_1/test_1> |
Запуск каждого тестового блока в заданном наборе с заданным исправлением |
< > |
<suite_1/suite_2/test_1 suite_1/suite_2/test_2 suite_1/test_2 suite_1/test_2A> |
Тест(ы) выполнения с заданным именем в любом наборе N-уровня |
< > |
<suite_1/suite_1/test_2 suite_1/suite_2/test_2> |
Для синтаксических производств, описывающих структуру<<test_set>
>значения см.здесь.
В то время как использование спецификации абсолютного тестового случая игнорирует статус запуска по умолчанию, она не игнорирует зависимости динамического тестирования. Если испытательный блок<B
>зависит от испытательного блока<A
>и тест<B
>задается для запуска<run_test
>,<A
>также запускается, даже если он не указан, и его отказ может привести к пропуску выполнения<B
>. Аналогичным образом, неудавшаяся проверка<precondition
>может привести к пропуску выбранного испытания.
Код |
---|
<#defineBOOST_TEST_MODULEdecorator_21 #include<boost/test/included/unit_test.hpp> namespaceutf=boost::unit_test; namespacett=boost::test_tools; tt::assertion_resultfail(utf::test_unit_id) { tt::assertion_resultans(false); ans.message()<<"precondition failed"; returnans; } BOOST_AUTO_TEST_CASE(test_1) { BOOST_TEST(false); } BOOST_AUTO_TEST_CASE(test_2, *utf::depends_on("test_1")) { BOOST_TEST(true); } BOOST_AUTO_TEST_CASE(test_3, *utf::precondition(fail)) { BOOST_TEST(true); }> |
выход |
---|
<>decorator_21--log_level=test_suite--run_test=test_2,test_3 Includingtestcasetest_1asadependencyoftestcasetest_2 Running3testcases... Enteringtestmodule"decorator_21" test.cpp(14):Enteringtestcase"test_1" test.cpp(16):error:in"test_1":checkfalsehasfailed test.cpp(14):Leavingtestcase"test_1";testingtime:3ms test.cpp(26):Testcase"test_3"isskippedbecausepreconditionfailed test.cpp(20):Testcase"test_2"isskippedbecausedependencytestcase"test_1"hasfailed Leavingtestmodule"decorator_21";testingtime:17ms ***1failureisdetectedinthetestmodule"decorator_21"> |
Термин «относительный» в этом контексте означает, что конфигурация основана либо на состоянии выполнения тестовых блоков по умолчанию, либо на переопределении командной строки, указанном вабсолютной спецификации; и, кроме того, мы дополнительно либо включаем некоторые отключенные тестовые блоки, либо отключаем некоторые включенные тестовые блоки. Относительная спецификация управляется аргументом командной строки<run_test
>, причем значение используется с использованием аналогичного синтаксиса, как и в абсолютной спецификации, но предшествует либо символу<'!'
>для отключения включенных тестовых блоков, либо символу<'+'
>для включения отключенных тестовых блоков. Это можно резюмировать в следующей таблице:
командовать |
Тип спецификации |
семантика |
---|---|---|
<> test_program -- > |
отключатель |
Включены тестовые блоки, соответствующие< |
<> test_program -- > |
Включатель |
Включены тестовые блоки с инвалидностью, которые соответствуют< |
Спецификацияиспользуется для включения набора тестовых блоков, которые изначально отключены.
Код |
---|
<#defineBOOST_TEST_MODULEdecorator_22 #include<boost/test/included/unit_test.hpp> namespaceutf=boost::unit_test; BOOST_AUTO_TEST_CASE(test_1) { BOOST_TEST(true); } BOOST_AUTO_TEST_CASE(test_net, *utf::disabled() *utf::description("requires network")) { BOOST_TEST(true); }> |
выход |
---|
<>decorator_22--list_content test_1* test_net:requiresnetwork >decorator_22--log_level=test_suite Running1testcase... Enteringtestmodule"decorator_22" test.cpp(6):Enteringtestcase"test_1" test.cpp(6):Leavingtestcase"test_1" Leavingtestmodule"decorator_22";testingtime:5ms ***Noerrorsdetected >decorator_22--log_level=test_suite--run_test=+test_net Running2testcases... Enteringtestmodule"decorator_22" test.cpp(6):Enteringtestcase"test_1" test.cpp(6):Leavingtestcase"test_1";testingtime:1ms test.cpp(13):Enteringtestcase"test_net" test.cpp(13):Leavingtestcase"test_net";testingtime:1ms Leavingtestmodule"decorator_22";testingtime:16ms ***Noerrorsdetected> |
И наоборот, спецификацияотключателяиспользуется для отключения набора тестовых блоков, которые первоначально включены.
Код |
---|
<#defineBOOST_TEST_MODULEdecorator_23 #include<boost/test/included/unit_test.hpp> namespaceutf=boost::unit_test; BOOST_AUTO_TEST_CASE(test_1) { BOOST_TEST(true); } BOOST_AUTO_TEST_CASE(test_net, *utf::description("requires network")) { BOOST_TEST(true); }> |
выход |
---|
<>decorator_23--list_content test_1* test_net*:requiresnetwork >decorator_23--log_level=test_suite Running2testcases... Enteringtestmodule"decorator_23" test.cpp(6):Enteringtestcase"test_1" test.cpp(6):Leavingtestcase"test_1" test.cpp(12):Enteringtestcase"test_net" test.cpp(12):Leavingtestcase"test_net" Leavingtestmodule"decorator_23";testingtime:14ms ***Noerrorsdetected >decorator_23--log_level=test_suite--run_test=!test_net Running1testcase... Enteringtestmodule"decorator_23" test.cpp(6):Enteringtestcase"test_1" test.cpp(6):Leavingtestcase"test_1" Leavingtestmodule"decorator_23";testingtime:5ms> |
Если в одной командной строке есть как активатор, так и отключатель, которые определяют один и тот же тест, тест становится отключенным. То есть отключатель имеет приоритет над активатором.
![]() |
Note |
---|---|
В то время как активатор дополнительно включает зависимости вверх по течению (введенные с декоратором< |
Статья Test unit filtering раздела Boost.Test Runtime parameters может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Runtime parameters ::
реклама |