code coverage tutorial
Този изчерпателен урок обяснява какво е покритие на кода при тестване на софтуер, неговите видове, предимства и недостатъци:
Крайната цел на всяка компания за разработка на софтуер е да разработи софтуер с добро качество. За да се постигне тази цел, софтуерът трябва да бъде щателно тестван.
По този начин тестването е неразделна част от разработването на софтуерно приложение. Следователно е от съществено значение разработеният софтуер да бъде прегледан от разработчика (което се прави по време на фазата на тестване на модула) и след това да бъде предаден на екипа на QC, за да бъде тестван щателно, за да се гарантира, че има минимални или никакви грешки.
Софтуерът е тестван единично, преди да бъде пуснат на действителния екип за тестване за тестване. Тъй като това тестване включва тестване на ниво код, то се извършва от разработчика. Това се прави, за да се гарантира, че всяка част от тествания код работи както се очаква.
Тук малки парчета код, които са разработени, се тестват изолирано, за да се гарантира тяхната коректност. Но въпросът, който често се очертава в съзнанието на разработчика, е колко от модулното тестване трябва да се направи и отговорът на това се крие в обхвата на кода.
Този урок ще ви даде задълбочени познания за това какво е покритие на кода и защо се нуждаем от него. Ще разберете как се различава от тестовото покритие.
Ще разгледаме също инструментите и методологиите, които се използват за покритие на кода и към края на този урок ще видим ползите заедно с неговите недостатъци. Някои от митовете, свързани с кодовото покритие, също ще бъдат разгледани тук.
Какво ще научите:
Какво е покритие на кода
Това е важна метрика за единично тестване. Полезно е да се знае ефективността на единичните тестове. Това е мярка, която показва какъв процент от изходния код ще бъде изпълнен по време на тестване.
С прости думи, степента, до която изходният код на софтуерна програма или приложение ще бъде изпълнен по време на тестване, е това, което се нарича Кодово покритие.
Ако тестовете изпълняват цялата част от кода, включително всички клонове, условия или цикли, тогава бихме казали, че има пълно покритие на всички възможни сценарии и по този начин покритието на кода е 100%. За да разберем това още по-добре, нека вземем пример.
По-долу е даден прост код, който се използва за добавяне на две числа и показване на резултата в зависимост от стойността на резултата.
Input a, b Let c = a + b If c <10, print c Else, print ‘Sorry’
Горната програма приема два входа, т.е. „a“ и „b“. Сумата от двете се съхранява в променлива c. Ако стойността на c е по-малка от 10, тогава се отпечатва стойността на „c“, в противен случай се отпечатва „Sorry“.
Сега, ако имаме някои тестове за валидиране на горната програма със стойностите на a & b, така че сумата винаги да е по-малка от 10, тогава останалата част от кода никога не се изпълнява. В такъв сценарий бихме казали, че покритието не е пълно.
Това беше само малък пример за изясняване на значението на Кодовото покритие. Докато изследваме повече, ще получите по-голяма яснота по въпроса.
Защо се нуждаем от покритие на кода
(изображение източник )
Различни причини правят кодовото покритие от съществено значение и някои от тях са изброени по-долу:
въпроси за интервю за застрахователен домейн на бизнес анализатор
- Помага да се установи, че софтуерът има по-малко грешки в сравнение със софтуера, който няма добро покритие на кода.
- Помагайки за подобряване на качеството на кода, той косвено помага за предоставянето на по-качествен софтуер.
- Това е мярка, която може да се използва, за да се знае ефективността на теста (ефективност на модулните тестове, написани за тестване на кода).
- Помага да се идентифицират онези части от изходния код, които биха останали непроверени.
- Помага да се определи дали текущото тестване (модулно тестване) е достатъчно или не и дали са необходими още някои тестове.
Покритие на кода срещу тестово покритие
За да разберем разликата между Кодово покритие и Тестово покритие, нека първо разберем значението на Тестовото покритие.
Тестово покритие
Това е мярка за това колко части от очакваното тестване са били обхванати по време на тестване на софтуер. От „Очаквано тестване“ имаме предвид пълния набор от тестови случаи, които са написани за изпълнение за тестване на даден софтуер.
Да предположим, че за тестване на софтуер е написан набор от общо 500 тестови случая. Сега, като част от тестовата дейност, бяха изпълнени само 300 тестови случая. Нека приемем, че това се дължи на липса на време. В този случай по-долу ще бъде тестовото покритие.
Тестово покритие = (Изпълнени тестови случаи / Общо тестови случаи) * 100
= (300/500) * 100
= 60%
Нека сравним това с това, което е покритие на кода.
Покритие на кода
Това е мярка, която показва степента, до която изходният код на приложение се изпълнява по време на тестването на кода. По този начин той показва степента, до която изходният код ще бъде тестван.
Да предположим, че да тествате приложение с 500 реда код, само 400 реда от кода се изпълняват чрез тестове. Да приемем, че това се дължи на определен цикъл / условие, който не се изпълнява. В този случай по-долу ще бъде покритието на кода.
Покритие на кода = (брой изпълнени редове код / общ брой редове код) * 100
= (400/500) * 100
= 80%
По-долу са посочени разликите между покритие на кода и покритие на теста:
Тестово покритие | Покритие на кода |
---|---|
Това е мярка за това колко част от очакваното тестване е била покрита по време на тестване на софтуер. | Това е мярка, която показва степента, до която изходният код на приложение се изпълнява по време на тестването на кода. |
Тестовото покритие може да се изчисли, като се използва формулата по-долу: Тестово покритие = (Изпълнени тестови случаи / Общо тестови случаи) * 100 | Покритието на кода може да се изчисли, като се използва формулата по-долу: Покритие на кода = (брой изпълнени редове код / общ брой редове код) * 100 |
Методологии
Тук ще обсъдим различните методи, които са / могат да бъдат използвани за измерване на покритието на кода.
За да разберем тези методологии, нека да разгледаме кодовия фрагмент по-долу:
Add (int a, int b) { If (b > a) { b = b - a Print b } If (a > b) { b = a – b Print b } Else Print ‘0’ }
Покритие на декларацията
Тази методология е мярка, която казва дали всички възможни изпълними изрази на код в изходния код са изпълнени поне веднъж. Това е метод, който гарантира, че всеки ред от изходния код е покрит поне веднъж от тестовете.
Това може да звучи просто, но трябва да се внимава, докато се измерва покритието на изявлението. Причината е, че в изходния код може да има определено състояние, което може да не се изпълни в зависимост от входните стойности.
Това би означавало, че всички редове на кода няма да бъдат обхванати при тестване. По този начин може да се наложи да използваме различни набори от входни стойности, за да покрием всички такива условия в изходния код.
Например, в горния изходен код, ако входните стойности се приемат като 2 и 3, тогава „Else“ частта на кода няма да бъде изпълнена. Ако обаче входните стойности са от тип 3 и 2, тогава частта „Ако“ на кода няма да бъде изпълнена.
Това означава, че с нито един от стойностите на нашата декларация покритието не би било 100%. В такъв случай може да се наложи да изпълним тестовете с всичките три ((2, 3), (3, 2), (0, 0)) набор от стойности, за да осигурим 100% покритие на изявлението.
Покритие на функцията
Както подсказва името, тази методология измерва степента, до която функциите, присъстващи в изходния код, са обхванати по време на тестването. Всички функции, които са в изходния код, се тестват по време на изпълнението на теста. Отново трябва да се гарантира, че тестваме тези функции за различни стойности, така че функцията да бъде тествана щателно.
В изходния код може да има множество функции и в зависимост от използваните входни стойности функция може или не може да бъде извикана. По този начин целта на функционалното покритие е да гарантира, че имаме всяка функция, за която се изисква.
Например, в изходния код по-горе, ако нашите тестове извикат функцията „Добавяне“ дори веднъж, тогава бихме извикали това като пълно покритие на функцията.
Състояние покритие
В изходния код, където и да имаме условие, резултатът ще бъде булева стойност или true или false. Условието покритие има за цел да установи дали тестовете обхващат и двете стойности, т.е. true, false.
В изходния код, когато всяко възникващо условие се оценява както за истински, така и за фалшиви състояния, тогава покритието за състояние за кода се казва, че е пълно.
Например, в горния код, ако се използват набори от стойности (2, 3) и (4, 2), тогава покритието на условието ще бъде 100%. Когато се използва набор от данни (2, 3), тогава (b> a) оценява на true и (a> b) оценява на false. По същия начин, когато се използва набор от данни (4, 2), тогава (b> a) оценява на false и (a> b) оценява на true.
По този начин и двете условия имат и двете стойности, т.е. вярно и невярно. Следователно покритието на състоянието ще бъде 100%.
Браншово покритие
Тази методология има за цел да гарантира, че всеки клон, който се появява във всяка условна структура, се изпълнява в изходния код. Например в горния код всички изявления „Ако“ и всички придружаващи изявления „Иначе“ трябва да бъдат обхванати от теста за 100% покритие на клона.
Например, в горния код, ако се използват набори от стойности (2, 3), (4, 2), (1, 1), тогава покритието на клона ще бъде 100%. Когато се използва набор от данни (2, 3), тогава (b> a) и първият клон ‘Ако’ се изпълнява. По същия начин, когато се използва набор от данни (4, 2), тогава (a> b) се оценява на true и вторият клон ‘Ако’ се изпълнява.
След това с набора от данни (1, 1) клонът ‘Else’ оценява на true и се изпълнява. По този начин се гарантира 100% покритие на клона.
Покритие на клона срещу състояние на покритие
Покритието на клона често се бърка с покритие на състоянието, но двете са различни.
Нека разберем това с прост пример.
If (a >0) & (b >0) Then Print “Hello” Else Print “Bye”
Нека запишем набора от данни, необходим за завършване Покритие на бранша:
(1, 1) - В този случай „a“ и „b“ и двете са верни, така че условието If се изпълнява.
(1, 0) - В този случай „a“ е вярно, а „b“ би било невярно, така че се изпълнява останалата част от кода.
Както знаем, целта на Branch Coverage е да се изпълни всеки клон поне веднъж и тази цел е постигната.
Покритие на състоянието:
(1, 0) - В този случай „a“ е вярно, а „b“ би било невярно.
(0, 1) - В този случай „a“ е невярно и „b“ би било вярно.
Целта на Condition Coverage е да получи всяко от true и false за всяко изпълнено условие и тази цел е постигната тук.
Забелязахте ли, че останалата част не се изпълнява в условие покритие? Това е мястото, където Покритието на състоянието се различава от Покритието на клона.
редактор на атоми срещу код на визуално студио
Инструменти за покритие на кода
На пазара се предлагат няколко инструмента за измерване на кодовото покритие на всеки софтуер.
По-долу са изброени някои от инструментите за справка:
- Parasoft JTest
- Testwell CTC ++
- Покритие
- JaCoCo
- CodeCover
- Покритие на Bullseye
- EMMA
- OpenCover
- NCover
- Скуош COCO
- CoverageMeter
- GCT
- TCAT C / C ++
- Гретел
- JCov
Препоръчително четене => Инструменти за покритие на кода
Горната връзка ще включва следната информация за тези инструменти:
- Основни функции
- Тип лиценз
- Официален URL адрес
- Предимства и недостатъци
- Последна версия
Ползи
Както се вижда по-горе, това е много полезна тестова метрика по следните причини:
- Помага да се идентифицират тези области в изходния код, които биха останали непроверени / непокрити от тестовете.
- Това е удобно при идентифициране на използван / мъртъв код, като по този начин подобрява качеството на кода.
- Ефективността на модулните тестове може да бъде известна с помощта на Code Coverage.
- Софтуер с по-добро качество може да бъде доставен с помощта на тези показатели.
Недостатъци
- Опитът да се стреми към 100% покритие на кода понякога причинява липса на стабилност на тестовете, което води до пропускане на улавянето на сценарии, предразположени към дефекти.
- За разлика от общоприетото схващане, той не може да гарантира дали проектираният софтуер отговаря на всички изисквания.
Митове срещу факти
Мит | Факт |
---|---|
Наличието на 100% покритие на кода гарантира, че софтуерът няма да има грешки. | Не, 100% покритие на кода не може да гарантира софтуер без грешки. Доброто покритие на кода, съчетано с добри усилия от екипа на QC, може да осигури софтуер с минимални или никакви грешки. |
Наличието на 100% покритие на кода означава, че написаният код е перфектен. | Не, всъщност, ако важните изисквания първоначално не са уловени от кода, тогава кодът не може да се определи като перфектен, въпреки че покритието на кода е 100%. |
Code Coverage измерва ефективността на тестовете, извършени върху софтуерен продукт. | Не, Покритието на кода е просто мярка, която се използва за тестване на ефективността на модулни тестове, т.е. тестовете, изпълнявани само върху изходния код на софтуер. |
ЧЗВ
В # 1) Какво е приемливо покритие на кода?
Отговор: Постигането на 100% покритие на кода не трябва да бъде целта по време на модулно тестване на софтуерния код. Но защо не? За да разберете причината, може да се наложи да се потопите малко по-дълбоко, за да разберете основното значение.
Когато се насочим към 100% покритие, тогава по-често се случва целият фокус при проектирането на тестовете да бъде проверен дали всеки оператор, цикъл, клон или условие ще бъде тестван. Така че ние се приземяваме, полагайки твърде много усилия, които може да не си струват да се има предвид прекараното време.
Освен това, фокусирането върху високо покритие води и до пропускане на важните сценарии, които вероятно имат дефекти, защото всичко, което целим, е да гарантираме, че всеки ред код е тестван.
Фокусирането върху високото покритие на кода не е толкова важно винаги и не може да бъде и фиксиран номер, който да се насочи за тестване на различни кодове. Като цяло обаче покритието от 75% - 80% трябва да бъде идеалното число.
разлики между c ++ и java
Докато тестваме нашия код, основният фокус трябва да се постави върху осигуряването на покритие на критичните и вероятни сценарии, склонни към грешки. Ако те бъдат пропуснати, въпреки че имаме 100% покритие на кода, нашите тестове просто ще имат лоша ефективност на теста.
Q # 2) Как да проверя покритието на кода си?
Отговор: За да тестваме процента на покритие на кода, който може да сте постигнали чрез тестовете, предназначени за тестване на кода, имаме няколко инструмента на пазара. В зависимост от езика за програмиране, който използваме, имаме различни инструменти.
Някои от тях са изброени по-долу:
- Java - Покритие, JaCoCo
- Javascript - Blanket.js, Истанбул
- Python - Coverage.py
- Руби - SimpleCov
Използвайки тези инструменти, можем да получим пълен отчет за покритието на нашите тестове, които ни помагат да знаем коя част от кода ще бъде изпълнена и коя ще бъде пропусната от нашите тестове.
Q # 3) Покритието на кода добра метрика ли е?
Отговор: В реални сценарии това е полезно до известна степен и по някои конкретни начини.
Разглеждайки първо неговите ограничения, ние много добре знаем, че наличието на 100% покритие не гарантира, че Кодексът не съдържа грешки, нито гарантира, че всички изисквания са покрити в кода, т.е. въпреки 100% покритие на кода, ние сме много вероятно е да има грешки в кода, причината е, че покритието не гарантира, че всички сценарии са тествани.
Освен това, ако изискванията са пропуснати по време на писането на кода, тогава няма картографиране на изискванията с кода, за който се грижи като част от покритието на кода.
Като казахме това, не можем да отречем, че когато използваме Code Coverage като метрики, това ни дава представа дали сме покрили основните изисквания за тестване на всеки ред от нашия код. Този процент на покритие ни дава представа за това колко части от нашия код се изпълняват с нашите модулни тестове.
Знаем колко от нашия код ще бъде неизпълнен. Това от своя страна ни помага да решим колко повече единични тестове са необходими и за кои части на кода.
По този начин можем да заключим, че слабото покритие ни дава представа за неефективността на модулните тестове. В същото време осигуряването на 100% покритие не е гаранция за код без дефекти. По този начин трябва да имаме балансиран подход, при който да не прекалено подчертаваме важността на насочването към висок процент на покритие на кода.
Q # 4) Как мога да подобря покритието на кода си?
Отговор: Докладът за покритие на кода, предоставен от инструменти за покритие като JaCoCo, Истанбул и др., Показва областите, които са обхванати от тестовете, както и тези, които ще останат непроверени.
Познавайки непроверените части на кода, тестовете могат да бъдат написани ръчно или с помощта на какъвто и да е инструмент за автоматизация, за да обхванат областите, които иначе биха останали непроверени и по този начин да увеличат покритието на кода.
Тук е важно да се отбележи, че докато можем да напишем стотици редове код, за да тестваме функция в код, но покритието може да е много по-малко. Причината е, че твърде дълбокото тестване на част от огромния код няма да помогне за увеличаване на покритието на кода.
По този начин, ако целта е да се увеличи покритието, трябва да се внимава да се покрият всички функции, условия и цикли, вместо да се гмуркате дълбоко в една функция и да пишете големи тестове за тази единична функция.
Заключение
Висококачественият софтуерен продукт е това, което се изисква в днешния забързан свят на интернет.
Осигуряването на качествен софтуер е отговорност не само на QA Engineer, но и отговорност на разработчика. По този начин Code Coverage е от голяма полза, когато става въпрос за предоставяне на качествен продукт на екипа за QA от разработчика (ите).
Този урок обясни всичко за покритието на кода и неговото използване. Също така разровихме малко по-дълбоко в разбирането на разликата между покритие на кода и покритие на теста. Освен това получихме разбиране за използваните методологии заедно с различни инструменти за покритие на кода.
Ползи и недостатъци бяха изнесени тук. И накрая, разбихме някои от митовете и често задаваните въпроси, свързани с кодовото покритие
Честито четене !!
Препоръчително четене
- Топ 15 инструменти за покритие на кода (за Java, JavaScript, C ++, C #, PHP)
- 15 най-добри инструменти на JAVA за разработка, изграждане, профилиране, покритие на код и преглед
- Урок за функции / методи на C # с примери за кодове
- C # Урок за обработка на изключения с примери за кодове
- Tortoise SVN Tutorial: Ревизии в кодовото хранилище
- Урок за дължина на масив Java с примери за кодове
- Урок за AWS CodeBuild: Извличане на код от Maven Build
- Урок за SVN: Управление на изходния код с помощта на Subversion