ПредишенСледващото

Arpan на септември. Технически директор, Synapti Компютърно проектиране Pvt Ltd

Arpan септември (Arpan Sen) - олово инженер работи върху разработването на софтуер в областта на електронното автоматизация дизайн. В продължение на няколко години той е работил по някои UNIX функции, включително Solaris, SunOS, HP-UX и IRIX, както и Linux и Microsoft Windows. Той взе силен интерес към методите на оптимизиране на ефективността на софтуер, теория на графите, както и паралелни изчисления. Arpan е завършил в софтуерни системи.

Какво е единица тестване?

С висока степен на вероятност сложен код, написани на C / C ++ език. Тя съдържа грешки. След като кодът е написан, за да намерите тези грешки ще бъдат трудни като търсене на игла в купа сено. По-разумен подход е да се тества отделните кодови фрагменти, тъй като те са създадени. За тази цел, да създаде малки (модулни) тестове, за да се покажат някои параметри, например, функция в С извършване интензивни изчисления, или определен клас на C ++. изисква създаване на специфична структура данни, като опашка. сложни регресионни тестове, установени в съответствие с тази философия, ще включват набор от единица тестове и пилотна програма, която ще се проведе на тези тестове и да докладва за резултатите.

Създаване на тест за конкретна функция или клас

Помислете обикновен низ клас, показан на Обява 1. Този клас не е много надежден, така че ние го изпробвате Boost.

Обява 1. Редовна низ клас

Редица стандартни проверки тест дали празен низ е нулева дължина, ако изходът на индекса на границата настъпили, които могат да бъдат показани в съобщения за грешки или изключения, и така нататък .. В Обява 2 показва някои от тестовете, което е важно да се изпълни някое изпълнение низ. За изпълнение на код в Обявата 2 просто го съставят използване г ++ (или всеки друг компилатор, който е съвместим с C ++ стандарт). Не е необходимо в изолация от основните функции, както и използването на всяка библиотека конфигурация: са включени всички необходими определения в unit_test.hpp хедър, който е част от настройката за Boost.

Обява 2. единица тестове за низа клас

Макроси BOOST_AUTO_TEST_SUITE BOOST_AUTO_TEST_SUITE_END и определяне на началото и края на тест пакет, съответно. Индивидуални тестове са разположени между макросите, и в това отношение семантиката на C ++ пространства подобни имена. Всеки отделен модулна тест се определя с използване BOOST_AUTO_TEST_CASE макро. Обява 3 показва резултатите от кода обявата 2.

Обява 3. Резултатите от кода списък 2

Нека погледнем по-отблизо в процеса на създаване на тестове от предишните списъци. Основната идея е да се тества качествата на отделния клас използване Boost макроси. Макроси и BOOST_CHECK BOOST_REQUIRE_EQUAL са предварително дефинирани макроси (или инструменти за тестване), включени в рамковото Boost, и имат за цел да се провери, че на изхода на кода.

инструменти за тестване Boost

Обява 4. Три варианта за използване на инструменти за тестване Boost

първо проверете BOOST_CHECK The завърши с неуспех, както и на първия тест BOOST_REQUIRE. Въпреки това, преди втория тест BOOST_CHECK тя не дойде, защото работата за изпитване е била прекъсната веднага след неуспешен проверка за завършване BOOST_REQUIRE. Обява 5 показва резултатите от изпълнението код в Обявата 4.

Ако изследването на проблема, който трябва да провери отделни функции или методи на клас, най-лесният начин за създаване на нов тест и се обадете на процедурата, да премине във входните аргументи и очакваните стойности. Такъв пример е показан на Обявата 6.

Обявата 6. Използване тласък за тестване на функциите и методите от класа

Сравнение на проби

Обща е сравнението на резултатите, върнати от една функция, с референтната стойност. За такива случаи също е много добре пригоден макро BOOST_CHECK. В допълнение, трябва да използвате output_test_stream клас от библиотеки Boost. Output_test_stream клас се инициализира с референтен файл (в този пример той run.log файл). Заключение C / C ++ функция се прехвърля към обекта output_test_stream. и след това призовава match_pattern процедура. Това е разгледано подробно в Пример 7.

Обява 7. модел за съвпадение, като се използва референтен файл

Сравнение на числа с плаваща запетая

Един от най-трудните изпитания в регресия тестване е да се сравнят стойностите на числа с плаваща запетая. Обърнете внимание на кода в Обява 8 - на пръв поглед изглежда, че всичко работи правилно.

Обява 8. Сравнение на плаваща точка, която не работи

По време на този тест изпълнение BOOST_CHECK макро не се осъществи, въпреки използването на SQRT функция. част от стандартните библиотеки. Какво има? Сравнение на точност проблема с плаваща запетая е: променливите f1 и резултат * резултат започват да се различават, тъй като някои от знака след десетичната запетая. За преодоляване на тази ситуация в Boost тестови инструменти включват BOOST_WARN_CLOSE_FRACTION макроси. BOOST_CHECK_CLOSE_FRACTION и BOOST_REQUIRE_CLOSE_FRACTION. За да използвате някоя от тях, трябва да се свържете предварително определен заглавна Boost floating_point_comparison.hpp. Всички тези три макроси има същия синтаксис, така че ние разглеждаме само проверката версия (вж Обява 9).

Обявата 9. Macro Синтаксис BOOST_CHECK_CLOSE_FRACTION

Вместо да използвате макро BOOST_CHECK. както е показано на Обява 9. Предложения използване макро BOOST_CHECK_CLOSE_FRACTION с приемлива точност на 0.0001. Този код е показана на Обявата 10.

Обявата 10. Сравнение на плаваща точка, която работи

Този код работи добре. Сега промените в Обява 10 на допустимата точност 0,0000001. Резултатът е показан в Пример 11.

Обявата 11. Грешка в сравнение поради недопустима степен на точност

Друга често срещана (и доста сложно) проблем, постоянно се срещат в работна версия на приложението е да се сравнят на променливите на бегом и плава видове. BOOST_CHECK_CLOSE_FRACTION макро има забележителен функция, която не позволява да се извърши такова сравнение. В ляво и дясно макро стойност трябва да е от същия тип: Наличните средства, или двойно. Ако в Обява 12 променливи f1 ще имат тип двойно и в резултат на резултат - поплавък тип грешка се случва по време на компилация.

Обява 12. Грешка: лява и дясна аргументи BOOST_CHECK_CLOSE_FRACTION The има различни видове

Подкрепа за потребителски предикат

тестови Boost инструменти могат да работят с булеви условия. Можете да разширите тези инструменти, така че да подкрепят по-сложен тест, например определяне на идентичността на съдържанието на двата списъка, или да потвърди, че специфичните условия за всички елементи на вектора. Можете също да разширите макро BOOST_CHECK. осигуряване на подкрепа за дефинирани от потребителя предикат. Нека се опитаме да извърши специален одит на съдържанието на списъка, генерирани от потребителска функция на езика С и се определи дали стойностите на всички тези елементи е по-голямо от 1. функция обичай валидиране трябва да се върне на тип тласък :: test_tools :: predicate_result. Смята се подробно в Обявата 13.

Обява 13. Проверка на сложни предикати с инструменти Boost

Predicate_result обект има негласно конструктор, който се логическа стойност. Това обяснява защо кодът работи добре, дори и в случаите, когато очакваната и фактическата възвръщаемост видове validate_list различават.

Друг начин да се тества сложни предикати, използващи Boost BOOST_CHECK_PREDICATE е да се използва макрос. Предимството на този макрос е, че той не използва predicate_result. Неговият недостатък е известна сложност на синтаксиса. В BOOST_CHECK_PREDICATE макро трябва да премине име на функция и аргумент (или аргументи). Обява 14 прави същото нещо като просто листинг 13 други макроси се използват в него. Обърнете внимание, че типът на връщане вече е validate_result Булева.

Обявата 14. Macro BOOST_CHECK_PREDICATE

Поставянето на множество тестови пакети в един файл

Можете да поставите няколко тестови пакети в един файл. Всеки тест пакет трябва да има един чифт BOOST_AUTO_TEST_SUITE макроси. BOOST_AUTO_TEST_SUITE_END. дефинирани в рамките на файла. Обява 15 показва две различни пакети за изпитване се поставят в един файл. Когато регресии работят изпълнимия файл с предварително определена опция -log_level = test_suite. Както можете да видите в Обява 16. изход, генериран с помощта на тази опция, то е по-податливи на бърза и подробна отстраняване на грешки.

Обява 15. Няколко тестови пакети, поставени в един файл

По-долу е с мощност получава чрез провеждане код обява 15.

Обява 16. Работещи множество тестови с опция -log_level

Разбиране на структурата на пакета за тест

Досега говорихме пакети за изпитване Boost, които нямат йерархична структура. Сега ние се опитваме да създадем с помощта на тест Boost пакета, който тества софтуер, тъй като това обикновено е потребителят вижда външни инструменти. В рамките на теста обикновено присъстват няколко тестови пакети, всеки от които проверява за определени функции. Така например, на рамка за регресия тестване Word процесор трябва да съдържа тестови пакети за проверка на шрифтовете подкрепят различни файлови формати, и така нататък. D. Всяка отделна опаковка тест съдържа някои единица тестове. Обява 17 показва пример на рамка за изпитване. Моля, имайте предвид, че входната точка, от която да започне изпълнение на код трябва да бъде процедура, наречена (подходящо) init_unit_test_suite.

Обява 17. Създаване на майстор тестов пакет да тече регресии

Всеки тест пакет (например, пакет TS1 на Фигура 17) е създадена с помощта на макро BOOST_TEST_SUITE. Макро очаква низ, който е името на тест пакета. Всички тестови пакети, в крайна сметка, се добавят към основната тестов пакет използва метод добавката. По същия начин можете да създадете изпитване на BOOST_TEST_CASE макро и го добавете към пакета за изпитване, като се използва метод добавката. Можете също да добавите единица тестове в основната тестов пакет, въпреки че това не се препоръчва. master_test_suite метод се определя като част от пространството от имена тласък :: unit_test :: рамка - в рамките тя изпълнява Сингълтън. Както е показано на Обява 18 код (съдържащ се в изходния код на Boost) обяснява как тя работи.

Обявата 18. Разбиране на метод master_test_suite

Тест модули, създадени с помощта BOOST_TEST_CASE макро. приема като входни аргументи, за да функционира указатели. Така Обява 17 test_case1 функция. test_case2 и така нататък. д. са празни невалидни-функции, които потребителят може да програмира така, както си иска. Все пак, имайте предвид, че Boost настройка тест използва определени малко количество памет на куп; BOOST_TEST_SUITE всяко повикване идва ново предизвикателство тласък :: unit_test :: test_suite (<имя тестового пакета>).

Тест тела - предварително конфигурирано състояние на средата, в която се извършва изпитването. След приключване на теста всички настройки на тази среда да вземат първоначалните им стойности. Пример приспособление е показано в Пример 19.

Обява 19. Обикновено тяло Boost

Резултатите са показани в Пример 20.

Обявата 20. Резултатите от помощта на приспособление Boost

Вместо да използвате макро BOOST_AUTO_TEST_CASE този код използва BOOST_FIXTURE_TEST_CASE макро. който се предава в допълнителен аргумент. Методи конструктор и деструктор на обекта и работи пречистване за настройка. Това се потвърждава от един бърз поглед към заглавието на unit_test_suite.hpp модула Boost (показваща 21).

Обява 21. Определяне тяло Boost заглавие unit_test_suite.hpp

Увеличете обществени клас наследява структура F структура (вж. Изброяването 19) и създава въз основа на него обект. В съответствие с правилата на наследяване C ++ обществени всички защитени и обществен променливи на класа структура директно достъпен от следващите функции. Имайте предвид, че променлива в Пример 19, променливата и т принадлежи към вътрешния тип обект F (вж. Изброяването 20). Нормално е по време на тест партида регресия тестване на явна инициализация (оттук и необходимостта от тела) се изисква само за две или три тестове. Обявата 22 показва пакета изследване, при което само един от трите тестове с помощта на приспособление.

Обявата 22. Тест тласък пакет, съдържащ приспособлението за тест с и без тела

Обява съдържа тела 22 са определени и използвани само в един тест. С макро BOOST_GLOBAL_FIXTURE (<имя фикстуры>) Boost позволява на потребителите да дефинират и да използват глобални тела. Можете да зададете произволен брой глобални тела, което позволява да се отделят за инициализиране на код. Един пример за използване на глобалната приспособление 23 е показан на регистрация.

Обява 23. С помощта на глобалната арматура за инициализация регресия

В случай на множество тела на тяхната настройка и унищожаване се случи в реда, в който са декларирани. В Обява 24, конструктора и деструктора на клас F се наричат ​​преди конструктор и деструктор клас F2 на, съответно.

Обява 24. Използване на централизирания глобалната тела в регресията

Имайте предвид, че не можете да използвате глобалните тела като обекти на отделни тестове. Също така е възможно да имат директен достъп до техния публичен / защитено нестатичен метод или променлива в теста.

заключение

  • Оригинална статия с отворен код C / C ++ единица тестване инструменти, Част 1: Запознайте се с рамката на Boost звено за анализ (EN).
  • Документация Boost (EN) - подробен наръчник, посветен на Boost тестови инструменти
  • Политики и протоколи Boost (EN) - Наръчник за политики и Boost протоколи за изпитване
  • пощенски списък Boost (EN) - разнообразие от информация, включително инструкции за отстраняване на неизправности при инсталиране и тестване

Свързани статии

Подкрепете проекта - споделете линка, благодаря!