![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
BOOST_TEST: details on expressionsBoost , Boost.Test , Writing unit tests
|
Код |
---|
<#defineBOOST_TEST_MODULEboost_test_macro3 #include<boost/test/included/unit_test.hpp> BOOST_AUTO_TEST_CASE(test_op_reportings) { inta=13,b=12; BOOST_TEST(a==b); BOOST_TEST(a<b); BOOST_TEST(a-1<b); BOOST_TEST(b>a-1); }> |
выход |
---|
<>./boost_test_macro3--log_level=all Running1testcase... Enteringtestmodule"boost_test_macro3" test.cpp(12):Enteringtestcase"test_op_reportings" test.cpp(15):error:in"test_op_reportings":checka==bhasfailed[13!=12] test.cpp(16):error:in"test_op_reportings":checka<bhasfailed[13>=12] test.cpp(17):error:in"test_op_reportings":checka-1<bhasfailed[13-1>=12] test.cpp(18):error:in"test_op_reportings":checkb>a-1hasfailed[12<=12] test.cpp(12):Leavingtestcase"test_op_reportings";testingtime:484us Leavingtestmodule"boost_test_macro3";testingtime:588us ***2failuresaredetectedinthetestmodule"boost_test_macro3"> |
Уже упоминалось, что отчетность не является симметричной (см.здесь). Выражение построено из<statement
>, появляющегося в макросе<BOOST_TEST
>. Это выражение позволяет оценивать и сообщать, например<"13 - 1 >= 12"failed
>, вместе с копией<statement
>, которая содержит больше деталей, чем<"a - 1
< b"failed
>. В деталях происходит следующее:
специальный объект,<seed
>выражения, составлен с левой стороны<statement
>. Этот первоначальный состав имеет наивысший приоритет перед поддерживаемыми операциями. Выражение ниже:
aop1bop2cop3d>
фактически рассматривается как
<(seeda)op1bop2cop3d>.
<seeda
>возвращает<expression
>объект, который отслеживает тип<a
>. Это выражение имеет перегрузки для ассоциативности слева направо, и операции<op1
>,<op2
>...прикованы цепьюсправа от этого объекта выражения:
aop1b>
уступает псевдокоду
<expression1=create-expression(a) expression2=create-expression(expression1,op1,b)>
<expression1
>и<expression2
>отслеживает их левый и правый операнды, и операцию на этих операндах. Выражения также отслеживают тип результата связанного подвыражения. В приведенном выше примере<expression1
>и<expression2
>имеют тип результата<decltype(a)
>и<decltype(aop1
b)
>соответственно. Тип результата позволяет сцеплять подвыражения.
В любом случае применяются правила приоритета операторов C++. То, что видно по выражению, - это то, что доступно с композицией слева направо. Любая другая операция, которая происходит до того, как она достигает правого операнда выражения, не рассматривается как подвыражение и рассматривается как единый операнд: правый операнд не развивается далее в рамках. Предположим, что<op2
>ниже имеет более высокий приоритет, чем<op1
>, тогда
aop1bop2c>
эквивалентно:
<create-expression(create-expression(a),op1,(bop2c))>
В приведенном выше заявлении окончательное выражение может видеть только результат<(b
op2c)
>справа от него, для которого в журналах не может быть предоставлено никаких дополнительных подробностей. Это также относится кправо-левымассоциативным операторам, таким как<!
>,<~
>,<-
>(унитарное отрицание) и т. Д.
Осторожность | |
---|---|
Поскольку< |
После построения полной экспрессионной цепи она оценивается как цепь подвыражений слева направо, точно так же, как правило композиции выше. Оцениваемые элементы являются элементами самого выражения. Выражение
<aop1b>
приводит к следующей цепи оценки:
<expression2.result=expression1.resultop1b expression1.result=a>
Окончательное выражение заявления отбрасывается на булев, который в свою очередь оценивается.Система испытаний на блоке
Приведенный ниже пример иллюстрирует конструкцию выражения слева направос цепями.
Код |
---|
<#defineBOOST_TEST_MODULEboost_test_macro2 #include<boost/test/included/unit_test.hpp> BOOST_AUTO_TEST_CASE(test_op_precedence) { inta=13,b=2,c=12; // left term of == is expanded in the logs BOOST_TEST(a%b==c); // right term of == is not expanded in the logs BOOST_TEST(a==c%b); } BOOST_AUTO_TEST_CASE(test_op_right_associative) { inta=1; BOOST_TEST(a); BOOST_TEST(!a); BOOST_TEST(--a); }> |
выход |
---|
<>./boost_test_macro2--log_level=all Running2testcases... test.cpp(16):error:in"test_op_precedence":checka%b==chasfailed[13%2!=12] test.cpp(18):error:in"test_op_precedence":checka==c%bhasfailed[13!=0] test.cpp(25):error:in"test_op_right_associative":check!ahasfailed test.cpp(26):error:in"test_op_right_associative":check--ahasfailed[(bool)0isfalse] ***4failuresaredetectedinthetestmodule"boost_test_macro2"> |
Статья BOOST_TEST: details on expressions раздела Boost.Test Writing unit tests может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Writing unit tests ::
реклама |