Какво е единично тестване?
UNIT TESTING е вид софтуерно тестване, при което се тестват отделни единици или компоненти на софтуера. Целта е да се потвърди, че всяка единица от софтуерния код работи според очакванията. Unit Testing се извършва по време на разработването (фаза на кодиране) на приложение от разработчиците. Единичните тестове изолират част от кода и проверяват верността му. Единицата може да бъде отделна функция, метод, процедура, модул или обект.
В SDLC, STLC, V модел, модулното тестване е първо ниво на тестване, извършено преди тестване на интеграция. Единичното тестване е техника за тестване на WhiteBox, която обикновено се извършва от разработчика. Въпреки това, в един практически свят поради криза във времето или нежелание на разработчиците да тестват, QA инженерите правят и модулни тестове.
В този урок ще научите -
- Защо единично тестване?
- Как да направите Unit Testing
- Техники за единично тестване
- Инструменти за единично тестване
- Разработване на тестово управление (TDD) и тестване на модули
- Мит за единично тестване
- Единично тестване предимство
- Недостатъци на единично тестване
- Най-добри практики за единично тестване
Защо единично тестване?
Единичното тестване е важно, тъй като разработчиците на софтуер понякога се опитват да спестят време, като правят минимално модулно тестване и това е мит, защото неподходящото тестване на модули води до скъпи корекции на дефекти по време на тестване на системата, тестване на интеграция и дори бета тестване след изграждането на приложението. Ако правилното тестване на модули се направи в началото на разработката, това спестява време и пари в крайна сметка.
Ето ключовите причини за извършване на модулно тестване в софтуерното инженерство:

- Единичните тестове помагат за отстраняване на грешки в началото на цикъла на разработка и спестяват разходи.
- Помага на разработчиците да разберат основата на кода за тестване и им позволява да правят промени бързо
- Добрите модулни тестове служат като проектна документация
- Единичните тестове помагат за повторното използване на кода. Мигрирайте както кода, така и тестовете си към новия си проект. Променете кода, докато тестовете стартират отново.
Как да направите Unit Testing
За да направят Unit Testing , разработчиците пишат раздел от код, за да тестват определена функция в софтуерно приложение. Разработчиците могат също да изолират тази функция, за да тестват по-стриктно, което разкрива ненужни зависимости между функцията, която се тества, и други единици, така че зависимостите могат да бъдат премахнати. Разработчиците обикновено използват модула UnitTest за разработване на автоматизирани тестови случаи за тестване на модули.
Единичното тестване е два вида
- Ръчно
- Автоматизиран
Единичното тестване обикновено се автоматизира, но все пак може да се извършва ръчно. Софтуерното инженерство не предпочита едното пред другото, но се предпочита автоматизацията. Ръчният подход към модулното тестване може да използва поетапен инструкционен документ.
При автоматизирания подход-
- Разработчик пише част от кода в приложението само за да тества функцията. По-късно те ще коментират и накрая ще премахнат тестовия код, когато приложението бъде внедрено.
- Разработчик може също да изолира функцията, за да я тества по-стриктно. Това е по-задълбочена практика за единично тестване, която включва копиране и поставяне на код в собствената среда за тестване, отколкото в естествената среда. Изолирането на кода помага за разкриване на ненужни зависимости между тествания код и други единици или пространства за данни в продукта. След това тези зависимости могат да бъдат премахнати.
- Кодерът обикновено използва UnitTest Framework за разработване на автоматизирани тестови случаи. Използвайки рамка за автоматизация, разработчикът кодира критерии в теста, за да провери коректността на кода. По време на изпълнение на тестовите случаи рамката регистрира неуспешни тестови случаи. Много рамки също автоматично ще сигнализират и докладват, в обобщение, тези неуспешни тестови случаи. В зависимост от тежестта на повреда, рамката може да спре последващото тестване.
- Работният процес на модулното тестване е 1) Създаване на тестови случаи 2) Преглед / преработка 3) Изходно ниво 4) Изпълнение на тестови случаи.
Техники за единично тестване
На Техники единица тестване са категоризирани главно на три части, които са тестване черна кутия, която включва тестване на потребителски интерфейс, заедно с вход и изход, тестване бялото поле, която включва проверка на функционалното поведение на заявлението софтуер и тестване на Грей кутия, която се използва за изпълнение на тест апартаменти, тестови методи, тестови случаи и извършване на анализ на риска.
Техниките за покритие на кода, използвани при тестване на единици, са изброени по-долу:
- Отчет за покритие
- Покритие на решението
- Браншово покритие
- Състояние покритие
- Крайно покритие на държавна машина
За повече информация вижте https://www.guru99.com/code-coverage.html
Пример за единичен тест: Фиктивни обекти
Единичното тестване разчита на създаването на фалшиви обекти за тестване на секции от код, които все още не са част от цялостно приложение. Фиктивни обекти се попълват за липсващите части на програмата.
Например може да имате функция, която се нуждае от променливи или обекти, които все още не са създадени. При модулното тестване те ще бъдат отчетени под формата на фалшиви обекти, създадени единствено за целите на модулното тестване, извършено в този раздел на кода.
Инструменти за единично тестване
На разположение са няколко софтуера за автоматизирано модулно тестване, които помагат при модулното тестване. Ще предоставим няколко примера по-долу:
- Junit: Junit е безплатен за използване инструмент за тестване, използван за езика за програмиране Java. Той предоставя твърдения за идентифициране на тестовия метод. Този инструмент първо тества данни и след това се вмъква в частта от кода.
- NUnit: NUnit е широко използвана рамка за модулно тестване, използвана за всички езици .net. Това е инструмент с отворен код, който позволява ръчно писане на скриптове. Той поддържа тестове, управлявани от данни, които могат да работят паралелно.
- JMockit: JMockit е инструмент за тестване на модули с отворен код. Това е инструмент за покритие на кода с показатели за линии и пътеки. Позволява подигравателен API с синтаксис на запис и проверка. Този инструмент предлага покритие на линията, покритие на пътя и покритие на данните.
- EMMA: EMMA е набор от инструменти с отворен код за анализ и докладване на код, написан на език Java. Ема поддържа типове покритие като метод, линия, основен блок. Той е базиран на Java, така че е без външни библиотечни зависимости и може да има достъп до изходния код.
- PHPUnit: PHPUnit е инструмент за модулно тестване за PHP програмист. Необходими са малки порции код, който се нарича единици и се тества всяка от тях поотделно. Инструментът също така позволява на разработчиците да използват предварително дефинирани методи за твърдение, за да твърдят, че системата се държи по определен начин.
Това са само няколко от наличните инструменти за модулно тестване. Има много повече, особено за езиците C и Java, но със сигурност ще намерите инструмент за модулно тестване за вашите нужди от програмиране, независимо от езика, който използвате.
Разработване на тестово управление (TDD) и тестване на модули
Единичното тестване в TDD включва широко използване на рамки за тестване. Единична тестова рамка се използва за създаване на автоматизирани модулни тестове. Рамките за модулно тестване не са уникални за TDD, но са от съществено значение за него. По-долу разглеждаме част от това, което TDD носи в света на модулното тестване:
- Тестовете се пишат преди кода
- Наистина много върху тестовите рамки
- Всички класове в приложенията са тествани
- Възможна е бърза и лесна интеграция
Мит за единично тестване
Мит: Това изисква време и аз винаги съм свръхсрочен. Моят код е твърд! Нямам нужда от модулни тестове.
По своята същност митовете са неверни предположения. Тези предположения водят до порочен кръг, както следва -
Истината е, че модулното тестване увеличава скоростта на развитие.
Програмистите смятат, че тестването на интеграция ще улови всички грешки и не изпълнява модулния тест. След като единиците бъдат интегрирани, много лесни грешки, които биха могли много лесно да бъдат открити и отстранени в тестваните единици, отнемат много време, за да бъдат проследени и отстранени.
Единично тестване предимство
- Разработчиците, които искат да научат каква функционалност се предоставя от модула и как да го използват, могат да разгледат модулните тестове, за да получат основно разбиране за API на модула.
- Единичното тестване позволява на програмиста да рефакторира кода на по-късна дата и да се увери, че модулът продължава да работи правилно (т.е. тестване с регресия). Процедурата е да се напишат тестови случаи за всички функции и методи, така че всеки път, когато дадена промяна причинява грешка, тя може бързо да бъде идентифицирана и отстранена.
- Поради модулния характер на модулното тестване, можем да тестваме части от проекта, без да чакаме други да бъдат завършени.
Недостатъци на единично тестване
- Не може да се очаква модулното тестване да засече всяка грешка в програма. Не е възможно да се оценят всички пътища за изпълнение дори в най-тривиалните програми
- Единичното тестване по своята същност се фокусира върху единица код. Следователно той не може да улови грешки при интеграцията или широки грешки на системно ниво.
Препоръчва се единично тестване да се използва заедно с други тестови дейности.
Най-добри практики за единично тестване
- Единичните тестове трябва да бъдат независими. В случай на подобрения или промяна в изискванията, тестовите случаи не трябва да бъдат засегнати.
- Тествайте само по един код наведнъж.
- Следвайте ясни и последователни конвенции за именуване за вашите модулни тестове
- В случай на промяна в кода в който и да е модул, уверете се, че има съответна единица Test Case за модула и модулът преминава тестовете, преди да смени изпълнението
- Грешките, идентифицирани по време на модулното тестване, трябва да бъдат отстранени, преди да се премине към следващата фаза в SDLC
- Приемете подход „тест като ваш код“. Колкото повече код пишете без тестване, толкова повече пътища трябва да проверите за грешки.

Обобщение
- UNIT TESTING се определя като вид софтуерно тестване, при което се тестват отделни модули или компоненти на софтуера.
- Както можете да видите, в модулното тестване може да участва много. Тя може да бъде сложна или по-скоро проста в зависимост от приложението, което се тества и използваните стратегии за тестване, инструменти и философии. Единичното тестване винаги е необходимо на някакво ниво. Това е сигурност.