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

Datasets generators

Boost , Boost.Test , Data-driven test cases

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

НесколькоГенераторыдля наборов данных реализованы вЕдиничная система испытаний:

Генераторы<stl>и<C-array>представляют собой просто представление набора данных о существующем сборе, в то время как диапазоны и последовательности случайных чисел описывают новые наборы данных.

Singletons

Синтетон — это набор данных, содержащий уникальное значение. Размер и удобство такого набора данных составляет 1. Эта ценность может быть

  • потребляется один раз
  • или повторяется столько раз, сколько необходимо для выполнения операции

Как упоминалось взип, при застегнутом распределении бесконечного размера полученный набор данных будет иметь размер 1.

Синглтон может быть построен с помощью функции<boost::unit_test::data::make>.

Example: Singleton

Код

<
#defineBOOST_TEST_MODULEdataset_example65
#include<boost/test/included/unit_test.hpp>
#include<boost/test/data/test_case.hpp>
#include<boost/test/data/monomorphic.hpp>
namespacebdata=boost::unit_test::data;
BOOST_DATA_TEST_CASE(
 test1,
 bdata::make(2),
 singleton)
{
 std::cout
   <<"test 1: "
   <<singleton<<std::endl;
 BOOST_TEST(singleton==2);
}
BOOST_DATA_TEST_CASE(
 test2,
 bdata::xrange(3)^bdata::make(2),
 xr,singleton)
{
 std::cout
   <<"test 2: "
   <<xr<<", "<<singleton<<std::endl;
 BOOST_TEST(singleton==2);
}
>

выход

<
>dataset_example65
Running4testcases...
test1:2
test2:0,2
test2:1,2
test2:2,2
***Noerrorsdetected
>
Datasets from C arrays

Этот тип наборов данных не содержит логики для генерации последовательности значений и используется в качестве обертки на существующей последовательности, содержащейся в массиве<C>. Плотность равна 1, а размер — размер массива.

Такие наборы данных просто построены из перегрузки функции<make>.

Example: Array

Код

<
#defineBOOST_TEST_MODULEdataset_example66
#include<boost/test/included/unit_test.hpp>
#include<boost/test/data/test_case.hpp>
#include<boost/test/data/monomorphic.hpp>
namespacebdata=boost::unit_test::data;
constchar*arr[]={"cat","dog"};
BOOST_DATA_TEST_CASE(
 test1,
 bdata::xrange(2)^bdata::make(arr),
 xr,array_element)
{
 std::cout<<"test 1: "
   <<xr<<", "
   <<array_element
   <<std::endl;
 BOOST_TEST(array_element!="mammoth");
}
>

выход

<
>dataset_example66
Running2testcases...
test1:0,cat
test1:1,dog
***Noerrorsdetected
>
Datasets from forward iterable containers

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

[Tip] Tip

Реализация C++11 позволяет генерировать набор данных из любого контейнера, в котором итератор реализует концепцию переднего итератора. Для C++03 эта функция включена в большинстве контейнеров STL.

Example: Dataset from std::vector and std::map

Код

<
#defineBOOST_TEST_MODULEexample67
#include<boost/test/included/unit_test.hpp>
#include<boost/test/data/test_case.hpp>
#include<boost/test/data/monomorphic.hpp>
#include<sstream>
namespacebdata=boost::unit_test::data;
// Generates a Fibonacci sequence
std::vector<float>fibonacci(){
 std::vector<float>ret(8);
 ret[0]=0;
 ret[1]=1;
 for(std::size_ts(2);s<ret.size();s++)
 {
   ret[s]=ret[s-1]+ret[s-2];
 }
 returnret;
}
BOOST_DATA_TEST_CASE(
 test1,
 bdata::make(fibonacci()),
 array_element)
{
 std::cout<<"test 1: "
   <<array_element
   <<std::endl;
 BOOST_TEST(array_element<=13);
}
// Generates a map from a vector
std::map<std::string,float>vect_2_str(std::vector<float>v)
{
 std::map<std::string,float>out;
 for(std::size_ts(0);s<v.size();s++)
 {
   std::ostringstreamo;
   o<<v[s];
   out[o.str()]=v[s];
 }
 returnout;
}
typedefstd::pair<conststd::string,float>pair_map_t;
BOOST_TEST_DONT_PRINT_LOG_VALUE(pair_map_t)
BOOST_DATA_TEST_CASE(
 test2,
 bdata::make(vect_2_str(fibonacci())),
 array_element)
{
 std::cout<<"test 2: \""
   <<array_element.first<<"\", "
   <<array_element.second
   <<std::endl;
 BOOST_TEST(array_element.second<=13);
}
>

выход

<
>dataset_example67
Running15testcases...
test1:0
test1:1
test1:1
test1:2
test1:3
test1:5
test1:8
test1:13
test2:"0",0
test2:"1",1
test2:"13",13
test2:"2",2
test2:"3",3
test2:"5",5
test2:"8",8
***Noerrorsdetected
>
Ranges

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

Можно построить линейку с использованием завода<boost::unit_test::data::xrange>, доступную в перегрузках ниже:

#include <boost/test/data/test_case.hpp>
#include <boost/test/data/monomorphic.hpp>
auto range1 = data::xrange( (data::step = 0.5, data::end = 3 ) ); // Constructs with named values, starting at 0
auto range2 = data::xrange( begin, end ); // begin < end required
auto range5 = data::xrange( begin, end, step );  // begin < end required
auto range3 = data::xrange( end ); // begin=0, end cannot be <= 0, see above
auto range4 = data::xrange( end, (data::begin=1) ); // named value after end
[Tip] Tip

Названные значения параметров должны быть объявлены в скобках

Parameters

Подробная информация о названных параметрах значений приводится в таблице ниже.

Table 1. Range parameters

Имя

по умолчанию

Описание

<begin>

0

Начало генерируемой последовательности. Значение<begin>включено в набор значений, возвращаемых генератором.

<end>

+ бесконечность

Конец сгенерированной последовательности. Значение<end>не включается в набор значений, возвращаемых генератором. Если опустить, то генератор имеет бесконечные размеры.

<step>

1

Число, указывающее шаг между двумя последовательными образцами генерируемого диапазона. Тип по умолчанию такой же, как и тип ввода. Это значение не должно быть 0. Он должен быть такого же знака, как<end-begin>

.

Example: Declaring a test with a range

Код

<
#defineBOOST_TEST_MODULEdataset_example59
#include<boost/test/included/unit_test.hpp>
#include<boost/test/data/test_case.hpp>
#include<boost/test/data/monomorphic.hpp>
namespacebdata=boost::unit_test::data;
BOOST_DATA_TEST_CASE(test1,bdata::xrange(5))
{
 std::cout<<"test 1: "<<sample<<std::endl;
 BOOST_TEST((sample<=4&&sample>=0));
}
BOOST_DATA_TEST_CASE(
 test2,
 bdata::xrange<int>((bdata::begin=1,bdata::end=10,bdata::step=3)))
{
 std::cout<<"test 2: "<<sample<<std::endl;
 BOOST_TEST((sample<=4&&sample>=0));
}
>

выход

<
>dataset_example59
Running8testcases...
test1:0
test1:1
test1:2
test1:3
test1:4
test2:1
test2:4
test2:7
test.cpp(27):error:in"test2/_2":check(sample<=4&&sample>=0)hasfailed
Failureoccurredinafollowingcontext:
   sample=7;
***1failureisdetectedinthetestmodule"dataset_example59"
>
Random value dataset

Этот тип набора данных генерирует последовательность случайных чисел после заданногораспределения. Также могут быть указанысемяидвигатель.

[Caution] Caution

Генератор случайных значений доступен только для компиляторов C++11. Если эта функция не поддерживается для компилятора, макрос<BOOST_TEST_NO_RANDOM_DATASET_AVAILABLE>будет автоматически установлен.Единичная система испытаний

Можно построить случайную последовательность, используя завод<boost::unit_test::data::random>, доступную в перегрузках ниже:

auto rdgen = random(); // uniform distribution (real) on [0, 1)
auto rdgen = random(1, 17); // uniform distribution (integer) on [1, 17]
// Default random generator engine, Gaussian distribution (mean=5, sigma=2) and seed set to 100.
auto rdgen = random( (data::seed = 100UL,
                      data::distribution = std::normal_distribution<>(5.,2)) );

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

[Tip] Tip

Для того, чтобы иметь возможность воспроизводить сбой в случае рандомизированного теста параметров, семя, сгенерировавшее сбой, может быть установлено для того, чтобы генерировать ту же последовательность случайных значений.

Parameters

Подробная информация о названных параметрах значений приводится в таблице ниже.

Table 2. Range parameters

Название параметра

по умолчанию

Описание

<seed>

(не установлен)

Семя для генерации случайной последовательности.

<distribution>

Форма

Пример распределения для генерации случайных последовательностей чисел. Значение<end>не включено в набор значений, возвращаемых генератором для реальных значений, и включено для целых чисел.

<engine>

<std::default_random_engine>

Генератор случайных чисел.


Example: Declaring a test with a random sequence

Код

<
#defineBOOST_TEST_MODULEdataset_example63
#include<boost/test/included/unit_test.hpp>
#include<boost/test/data/test_case.hpp>
#include<boost/test/data/monomorphic.hpp>
namespacebdata=boost::unit_test::data;
BOOST_DATA_TEST_CASE(
 test1,
 bdata::random(1,17)^bdata::xrange(7),
 random_sample,index)
{
 std::cout<<"test 1: "<<random_sample
           <<", "<<index<<std::endl;
 BOOST_TEST((random_sample<=17&&random_sample>=1));
}
BOOST_DATA_TEST_CASE(
 test2,
 bdata::random((bdata::distribution=std::uniform_real_distribution<float>(1,2)))
     ^bdata::xrange(7),
 random_sample,index)
{
 std::cout<<"test 2: "<<random_sample
           <<", "<<index<<std::endl;
 BOOST_TEST(random_sample<1.7);// 30% chance of failure
}
>

выход

<
>dataset_example63
Running14testcases...
test1:2,0
test1:3,1
test1:2,2
test1:8,3
test1:10,4
test1:15,5
test1:8,6
test2:1.00001,0
test2:1.13154,1
test2:1.75561,2
test.cpp(35):error:in"test2/_2":checkrandom_sample<1.7hasfailed[1.75560534>=1.7]
Failureoccurredinafollowingcontext:
   random_sample=1.75560534;index=2;
test2:1.45865,3
test2:1.53277,4
test2:1.21896,5
test2:1.04704,6
***1failureisdetectedinthetestmodule"dataset_example63"
>

PrevUpHomeNext

Статья Datasets generators раздела Boost.Test Data-driven test cases может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Data-driven test cases ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 06:47:49/0.012693881988525/1