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

Contexts

Boost , Boost.Test , Tools supports for logging

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

Средства, предоставляемыеЕдиная тестовая системаДля того, чтобы лучше отслеживать местоположение утверждений. Чтобы понять идею, рассмотрим следующий пример:

void test_operations(Processor& processor, int limit)
{
  for (int i = 0; i < limit; ++i) {
    BOOST_TEST(processor.op1(i));
    for (int j = 0; j < i; ++j) {
      BOOST_TEST(processor.op2(i, j));
    }
  }
}

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

BOOST_TEST(processor.op1(i));

замененный на

BOOST_TEST_MESSAGE(processor.op1(i), "With parameter i = " << i);

В этом тривиальном примере мы видим, что контекст, который в данном случае является переменной<i>, должен быть признан утверждением<BOOST_CHECK>определенным образом. В приведенном выше подходе это делается путем добавления сообщения к самому утверждению.

Что, если контекст более сложный? В случае, если сложность контекста возрастает, трудно поддерживать тот факт, что утверждение и контекст тесно связаны, как в вышеприведенном подходе:

void test_operations(Processor& processor, int limit, int level)
{
  for (int i = 0; i < limit; ++i) {
    BOOST_TEST_MESSAGE(processor.op1(i),
                       "With optimization level " << level << ", With parameter i = " << i);
    for (int j = 0; j < i; ++j) {
      BOOST_TEST_MESSAGE(processor.op2(i, j),
                         "With optimization level " << level <<
                         ", With parameter i = " << i << ", With parameter j = " << j);
    }
  }
}
BOOST_AUTO_TEST_CASE(test1)
{
  Processor processor;
  for (int level = 0; level < 3; ++level) {
    processor.optimization_level(level);
    test_operations(processor, 2, level);
  }
}

Обратите внимание на длину сообщений, повторение и тот факт, что мы передаем аргумент<level>для функционирования<test_operations>только ради генерации сообщения об ошибке в случае сбоя.

Поэтомусвободнаясвязь между контекстом утверждения и точкой утверждения является желательным свойством.

Assertion-bound context

Макро<BOOST_TEST_INFO>может использоваться для определения сообщения об ошибке, которое должно быть связано с первым следующим утверждением. Если (и только если) утверждение не удается, связанное сообщение будет отображаться вдоль:

Example: Assertion-bound context

Код

<
#defineBOOST_TEST_MODULEexample80
#include<boost/test/included/unit_test.hpp>
voidtest()
{
 BOOST_TEST(false);
}
BOOST_AUTO_TEST_CASE(test_case1)
{
 BOOST_TEST_INFO("Alpha");
 BOOST_TEST_INFO("Beta");
 BOOST_TEST(true);
 BOOST_TEST_INFO("Gamma");
 chara='a';
 BOOST_TEST_INFO("Delt"<<a);
 test();
}
>

выход

<
>example
Running1testcase...
test.cpp(14):error:in"test_case1":checkfalsehasfailed
Failureoccurredinafollowingcontext:
   Gamma
   Delta
***1failuresisdetectedintestmodule"example80"
>

Соблюдайте следующие вещи. Информация, содержащаяся внутри<BOOST_TEST_INFO>, связана только с первым утверждением после заявления. Таким образом, связанная информация отображается только в случае неудачи утверждения; в противном случае сообщение отбрасывается. Декларация<BOOST_TEST_INFO>не должна непосредственно предшествовать утверждению, допускается их переплетение с другими инструкциями, они могут быть заявлены даже в разных объемах. Следовательно, можно также связать более одной информации с данным утверждением.

С<BOOST_TEST_INFO>мы можем улучшить наш первоначальный пример следующим образом:

void test_operations(Processor& processor, int limit, int level)
{
  for (int i = 0; i < limit; ++i) {
    BOOST_TEST_INFO("With optimization level " << level);
    BOOST_TEST_INFO("With parameter i = " << i);
    BOOST_TEST(processor.op1(i));
    for (int j = 0; j < i; ++j) {
      BOOST_TEST_INFO("With optimization level " << level);
      BOOST_TEST_INFO("With parameter i = " << i);
      BOOST_TEST_INFO("With parameter j = " << j);
      BOOST_TEST(processor.op2(i, j));
    }
  }
}
BOOST_AUTO_TEST_CASE(test1)
{
  Processor processor;
  for (int level = 0; level < 3; ++level) {
    processor.optimization_level(level);
    test_operations(processor, 2, level);
  }
}

Scope-bound context

Макро<BOOST_TEST_CONTEXT>определяет диагностическое сообщение и область применения. Сообщение связано с каждым утверждением в объеме и отображается вместе с каждым неудавшимся утверждением.

Example: Scope-bound context

Код

<
#defineBOOST_TEST_MODULEexample81
#include<boost/test/included/unit_test.hpp>
voidtest()
{
 BOOST_TEST(2!=2);
}
BOOST_AUTO_TEST_CASE(test_case1)
{
 BOOST_TEST_CONTEXT("Alpha"){
   BOOST_TEST(1!=1);
   test();
   BOOST_TEST_CONTEXT("Be"<<"ta")
     BOOST_TEST(3!=3);
   BOOST_TEST(4==4);
 }
 BOOST_TEST(5!=5);
}
>

выход

<
>example
Running1testcase...
test.cpp(20):error:in"test_case1":check1!=1hasfailed[1==1]
Failureoccurredinafollowingcontext:
   Alpha
test.cpp(14):error:in"test_case1":check2!=2hasfailed[2==2]
Failureoccurredinafollowingcontext:
   Alpha
test.cpp(24):error:in"test_case1":check3!=3hasfailed[3==3]
Failureoccurredinafollowingcontext:
   Alpha
   Beta
test.cpp(29):error:in"test_case1":check5!=5hasfailed[5==5]
***4failuresaredetectedintestmodule"example81"
>

Соблюдайте следующие вещи. После макроса<BOOST_TEST_CONTEXT>у нас есть пара брекетов: они определяют область, в которой действует диагностическое сообщение. Если брекеты отсутствуют, то сфера применения распространяется только на следующее утверждение.<BOOST_TEST_CONTEXT>Объявления могут гнездиться.

С помощью<BOOST_TEST_CONTEXT>мы можем еще больше улучшить наш первоначальный пример, поместив переменную<level>в контекст уровня охвата и не передав его в качестве функционального параметра:

void test_operations(Processor& processor, int limit)
{
  for (int i = 0; i < limit; ++i) {
    BOOST_TEST_INFO("With parameter i = " << i);
    BOOST_TEST(processor.op1(i));
    for (int j = 0; j < i; ++j) {
      BOOST_TEST_INFO("With parameter i = " << i);
      BOOST_TEST_INFO("With parameter j = " << j);
      BOOST_TEST(processor.op2(i, j));
    }
  }
}
BOOST_AUTO_TEST_CASE(test1)
{
  Processor processor;
  for (int level = 0; level < 3; ++level) {
    BOOST_TEST_CONTEXT("With optimization level " << level) {
      processor.optimization_level(level);
      test_operations(processor, 2);
    }
  }
}

Если мы увидим, что переменная<i>также применима в определенной области, мы сможем еще больше улучшить наш пример.

Example: Using contexts

Код

<
#defineBOOST_TEST_MODULEexample82
#include<boost/test/included/unit_test.hpp>
structProcessor
{
 intlevel;
 voidoptimization_level(intl){level=l;}
 boolop1(int){returnlevel<2;}
 boolop2(int,int){returnlevel<1;}
};
voidtest_operations(Processor&processor,intlimit)
{
 for(inti=0;i<limit;++i){
   BOOST_TEST_CONTEXT("With parameter i = "<<i){
     BOOST_TEST(processor.op1(i));
     for(intj=0;j<i;++j){
       BOOST_TEST_INFO("With parameter j = "<<j);
       BOOST_TEST(processor.op2(i,j));
     }
   }
 }
}
BOOST_AUTO_TEST_CASE(test1)
{
 Processorprocessor;
 for(intlevel=0;level<3;++level){
   BOOST_TEST_CONTEXT("With optimization level "<<level){
     processor.optimization_level(level);
     test_operations(processor,2);
   }
 }
}
>

выход

<
>example
Running1testcase...
test.cpp(27):error:in"test1":checkprocessor.op2(i,j)hasfailed
Failureoccurredinafollowingcontext:
   Withoptimizationlevel1
   Withparameteri=1
   Withparameterj=0
test.cpp(24):error:in"test1":checkprocessor.op1(i)hasfailed
Failureoccurredinafollowingcontext:
   Withoptimizationlevel2
   Withparameteri=0
test.cpp(24):error:in"test1":checkprocessor.op1(i)hasfailed
Failureoccurredinafollowingcontext:
   Withoptimizationlevel2
   Withparameteri=1
test.cpp(27):error:in"test1":checkprocessor.op2(i,j)hasfailed
Failureoccurredinafollowingcontext:
   Withoptimizationlevel2
   Withparameteri=1
   Withparameterj=0
***4failuresaredetectedinthetestmodule"example82"
>

PrevUpHomeNext

Статья Contexts раздела Boost.Test Tools supports for logging может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Tools supports for logging ::


реклама


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

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