![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Datasets generatorsBoost , Boost.Test , Data-driven test cases
|
Код |
---|
<#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> |
Этот тип наборов данных не содержит логики для генерации последовательности значений и используется в качестве обертки на существующей последовательности, содержащейся в массиве<C
>. Плотность равна 1, а размер — размер массива.
Такие наборы данных просто построены из перегрузки функции<make
>.
Код |
---|
<#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> |
Что касается<C
>массивов, то этот тип наборов данных не содержит логики для генерации последовательности значений и используется для разбора существующей последовательности. Площадка 1 и размер такой же, как у контейнера.
![]() |
Tip |
---|---|
Реализация C++11 позволяет генерировать набор данных из любого контейнера, в котором итератор реализует концепцию переднего итератора. Для C++03 эта функция включена в большинстве контейнеров STL. |
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> |
Диапазон представляет собой набор данных, который реализует последовательность одинаково распределенных значений, определяемых началоми концоми шагом.
Можно построить линейку с использованием завода<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 |
---|---|
Названные значения параметров должны быть объявлены в скобках |
Подробная информация о названных параметрах значений приводится в таблице ниже.
Table 1. Range parameters
Имя |
по умолчанию |
Описание |
---|---|---|
< |
0 |
Начало генерируемой последовательности. Значение< |
< |
+ бесконечность |
Конец сгенерированной последовательности. Значение< |
< |
1 |
Число, указывающее шаг между двумя последовательными образцами генерируемого диапазона. Тип по умолчанию такой же, как и тип ввода. Это значение не должно быть 0. Он должен быть такого же знака, как< |
Код |
---|
<#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"> |
Этот тип набора данных генерирует последовательность случайных чисел после заданногораспределения. Также могут быть указанысемяидвигатель.
![]() |
Caution |
---|---|
Генератор случайных значений доступен только для компиляторов C++11. Если эта функция не поддерживается для компилятора, макрос< |
Можно построить случайную последовательность, используя завод<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 |
---|---|
Для того, чтобы иметь возможность воспроизводить сбой в случае рандомизированного теста параметров, семя, сгенерировавшее сбой, может быть установлено для того, чтобы генерировать ту же последовательность случайных значений. |
Подробная информация о названных параметрах значений приводится в таблице ниже.
Table 2. Range parameters
Название параметра |
по умолчанию |
Описание |
---|---|---|
< |
(не установлен) |
Семя для генерации случайной последовательности. |
< |
Форма |
Пример распределения для генерации случайных последовательностей чисел. Значение< |
< |
< |
Генератор случайных чисел. |
Код |
---|
<#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"> |
Статья Datasets generators раздела Boost.Test Data-driven test cases может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Data-driven test cases ::
реклама |