Модульне тестування (англ. Unit testing) — це метод тестування програмного забезпечення, який полягає в окремому тестуванні кожного модуля коду програми. Модулем називають найменшу частину програми, яка може бути протестованою. У процедурному програмуванні модулем вважають окрему функцію або процедуру. В об'єктно-орієнтованому програмуванні — метод[].
Модульні тести, або unit-тести, розробляють в процесі розробки програмісти та, іноді, тестувальники білої скриньки (white-box testers).
Зазвичай unit-тести застосовують для того, щоб упевнитися, що код відповідає вимогам архітектури та має очікувану поведінку.
Переваги
Метою модульного тестування є ізоляція кожної частини програми та впевненість у тому, що кожна окрема частина є коректною. Модульний тест забезпечує жорсткий «контракт», за яким має працювати тестований код. Як результат, це надає деякі переваги. Модульне тестування допомагає знайти помилки раніше в циклі розробки ПЗ, що робить розробку дешевшою та швидшою.
Легкий рефакторинг
Модульне тестування дозволяє програмісту, коли він буде змінювати код (проводити рефакторинг) бути впевненим, що модуль працює вірно (це — регресивне тестування). Оскільки модульне тестування вимагає написання тестів для всіх функцій та методів у програмі, помилки швидко локалізуються та виправляються.
Спрощене інтеграційне тестування
Модульне тестування може бути застосоване в інтеграційному тестуванні: тестування окремих модулів та сукупності цих модулів робить інтеграційне тестування легшим. Однак модульне тестування знизу вгору не є інтеграційним тестуванням. Інтеграція з зовнішніми модулями має включатися до інтеграційних тестів, а не до модульних.
Документування
Модульні тести являють собою специфічний вид документації до системи. Розробники можуть подивитися на модульний тест, щоб дізнатися про функції, що виконує модуль, та як його застосовувати.
Unit-тест перевіряє критичні характеристики модулю. Відповідність чи невідповідність цим характеристикам демонструє коректність модуля. Модульний тест «документує» ці критичні характеристики, але не треба покладатися лише на код в документуванні ПЗ під час розробки.
Слід відзначити, що звичайна письмова документація дуже повільно реагує на зміни в коді, тоді як модульні тести завжди відображають поточний стан модуля.
Розробка
Під час розробки програмного забезпечення методом TDD (Test-driven development), модульний тест стає частиною розробки ПЗ. Кожен тест визначає потрібні класи та методи, їх очікувану поведінку. Наведений нижче приклад на мові Java добре демонструє використання unit-тестів під час розробки методом TDD.
Тест-клас за назвою TestAdder визначає декілька програмних елементів, що повинні бути реалізовані. По-перше, у програмі має бути інтерфейс з назвою Adder та клас з назвою AdderImpl, що його реалізує, також має бути конструктор без параметрів. Інтерфейс Adder повинен мати метод add, який приймає 2 параметри (цілі числа) і повертає назад також ціле число. Також цей код визначає поведінку методу add на невеликому наборі значень.
public class TestAdder { public void testSum() { Adder adder = new AdderImpl(); assert(adder.add(1, 1) == 2); assert(adder.add(1, 2) == 3); assert(adder.add(2, 2) == 4); assert(adder.add(0, 0) == 0); assert(adder.add(-1, -2) == -3); assert(adder.add(-1, 1) == 0); assert(adder.add(1234, 988) == 2222); } }
У цьому випадку, спочатку був написаний модульний тест, а потім вже функціональність, яку він визначає. Цей тест визначає лише поведінку майбутнього методу, залишаючи технічні деталі реалізації програмісту.
Ось метод, що відповідає вимогам, які поставлено тестом:
interface Adder { int add(int a, int b); } class AdderImpl implements Adder { int add(int a, int b) { return a + b; } }
Важливою перевагою модульного тестування є те, що тести одразу демонструють, відповідає, чи не відповідає реалізація вимогам розробки. Реалізація з помилками, скоріше за все, не зможе пройти модульні тести.
Відокремлення інтерфейсу від реалізації
Призначення модульного тесту — тестування єдиного програмного модулю. Але часто розробники та тестувальники створюють тести, що не відповідають цій умові. У випадку, якщо клас А містить посилання на клас В, тестування класу А перетікає в тестування класу В. Розглянемо приклад.
Є клас, що залежить від бази даних. Модульні тести, які пишуться для нього, можуть взаємодіяти з БД, щоб визначити коректність поведінки класу. Такий підхід є некоректним. У такому випадку модульний тест виходить за межі своєї відповідальності, за межі тестованого класу та перетинає межу іншого класу/процесу/комп'ютерної мережі. Модульні тести, що написані таким чином, перетворюються на інтеграційні тести. Коли ці тести перестають працювати, важко локалізувати помилку.
Правильним підходом можна вважати створення абстрактних інтерфейсів для запитів до БД, а реалізуються ці інтерфейси за допомогою mock-об'єктів (фіктивних об'єктів).
Взаємодія unit-тестів лише з абстрактними інтерфейсами забезпечує ретельніше тестування. Як результат — легше та дешевше супроводження.
Обмеження
Тестування програмного забезпечення не може знайти всіх помилок у програмі. У більшості програм неможливо прорахувати кожен варіант виконання. Це також вірно для модульного тестування. Крім того, модульне тестування, власне, повинне тестувати тільки модулі. Так що цей вид тестування не зможе знайти інтеграційні помилки та інші: помилки архітектури, проблеми з витримкою навантажень на ПЗ. Unit-тестування має проводитись разом з іншими видами тестування програмного забезпечення.
Як і будь-який вид тестування, модульне тестування може визначити лише наявність помилок, а не їх відсутність.
Тестування ПЗ — це комбінаторна задача. Наприклад, кожне логічне судження повинно мати не менш двох тестів: один перевіряє результат істинно, а другий хибно. Внаслідок цього, часто на кожний рядок коду доводиться написати від 3 до 5 рядків тесту. Це вимагає багато часу та грошей, які часто не варті результату.
Застосування
Екстремальне програмування
Модульне тестування — це наріжний камінь екстремального програмування, яке покладається на автоматичне створення тестів. Автоматична генерація тестів може здійснюватись сторонніми бібліотеками, як то jUnit, або власними продуктами компанії-розробника.
Екстремальне програмування використовує створення модульних тестів для test-driven development. Розробники пишуть модульні тести, які визначають усі вимоги до програми. Ці тести будуть неуспішними, якщо потрібні вимоги ще не реалізовано, або якщо реалізація має дефекти.
Екстремальне програмування дотримується стратегії «тестуйте все, що потенційно може викликати помилку», замість традиційної «тестуйте усі можливі шляхи виконання». Тому більша частина коду покрита unit-тестами, але не весь код.
Важливо відзначити, що код тестів вважається одним з найважливіших артефактів проекту, бо супроводжується так само якісно і в такому ж обсязі, як і функціональний код. Розробники відправляють код тестів до репозиторію разом із тим кодом, що вони тестують. Ретельне тестування в екстремальному програмуванні дозволяє легше супроводжувати код, проводити його рефакторинг, інтеграцію, вести добру документацію. Ці модульні тести також працюють як форма регресивного тестування.
Технологія
Модульне тестування зазвичай автоматизують, але його можна проводити й вручну. IEEE не надає перевагу якомусь з цих методів.
Мета модульного тестування — ізолювати модуль та визначити його коректність. Автоматизоване тестування дозволяє зробити це ефективно та має багато переваг. Якщо тестування було погано заплановано, то необережне ручне тестування може стати ще й інтеграційним тестуванням, що погано.
Щоб повністю реалізувати ефект ізоляції модуля під час автоматизованого тестування, його код виконують у межах особливого фреймворку, без зв'язку з природним середовищем. Іншими словами, код запускають поза продуктом, або контекстом виклику, для якого його було написано. Такий спосіб тестування показує неважливі залежності між кодом, що тестується та іншими модулями системи.
Використовуючи фреймворк для модульного тестування, розробник задає критерії, за якими визначається успішність тесту. Під час виконання тестування, фреймворк повідомляє про тести, що не задовольняють критеріям. Залежно від важливості невиконаного тесту, фреймворк може зупинити подальше тестування.
Як наслідок, модульне тестування традиційно мотивує програмістів писати код із меншою зв'язністю англ. Coupling, та більшою пов'язаністю англ. Cohesion.
Фреймворки
Фреймворки для модульного тестування зазвичай не розповсюджуються в комплекті з компіляторами — це програмне забезпечення пишуть окремо. Вони розроблені для багатьох мов програмування й допомагають спростити процес тестування. Серед відомих фреймворків є проекти open source, наприклад ті, що зазвичай називають xUnit, та комерційні рішення, такі як TBrun, Testwell CTA++ and VectorCAST/C++.
Також можливо виконувати модульне тестування без додаткових бібліотек, створюючи код, що застосовує механізми assertion, виняткових ситуацій англ. exception, та інші механізми контролю виконання програми, які можуть сигналізувати про неуспіх.
Великий перелік різних фреймворків та їх характеристик наразі доступний в англомовному розділі Вікіпедії: [en].
Підтримка модульного тестування на рівні мови
Деякі мови програмування підтримують модульне тестування безпосередньо. Їх граматика дозволяє використання модульного тестування без імпорту додаткових бібліотек.
Мови, що підтримують модульне тестування:
Приклад мовою D:
class ABC { this() { val = 2; } private int val; public func() { val *= 2; } } unittest { ABC a; a.func(); assert( a.val > 0 && a.val < 555 ); // Можна звернутися до закритої змінної всередині модуля }
Див. також
- Екстремальне програмування
- Тестування програмного забезпечення
- Test-driven development
- jUnit — фреймворк для Java, з сімейства xUnit.
Примітки
- Kolawa, Adam; Huizinga, Dorota (2007). . Wiley-IEEE Computer Society Press. с. 75. ISBN . Архів оригіналу за 25 квітня 2012. Процитовано 23 жовтня 2011.
{{}}
: Вказано більш, ніж один|pages=
та|page=
() - (20 вересня 2007). Alberto Savoia sings the praises of software testing. Архів оригіналу за 16 липня 2013. Процитовано 29 листопада 2007.
- IEEE Standards Board, "IEEE Standard for Software Unit Testing: An American National Standard, ANSI/IEEE Std 1008-1987" [ 30 жовтня 2007 у Wayback Machine.] in IEEE Standards: Software Engineering, Volume Two: Process Standards; 1999 Edition; published by The Institute of Electrical and Electronics Engineers, Inc. Software Engineering Technical Committee of the IEEE Computer Society.
Посилання
- Unit Testing Guidelines from GeoSoft [ 10 квітня 2009 у Wayback Machine.]
- Test Driven Development (Ward Cunningham's Wiki) [ 12 травня 2011 у Wayback Machine.]
- Unit Testing 101 for the Non-Programmer [ 19 січня 2022 у Wayback Machine.]
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Modulne testuvannya angl Unit testing ce metod testuvannya programnogo zabezpechennya yakij polyagaye v okremomu testuvanni kozhnogo modulya kodu programi Modulem nazivayut najmenshu chastinu programi yaka mozhe buti protestovanoyu U procedurnomu programuvanni modulem vvazhayut okremu funkciyu abo proceduru V ob yektno oriyentovanomu programuvanni metod dzherelo Modulni testi abo unit testi rozroblyayut v procesi rozrobki programisti ta inodi testuvalniki biloyi skrinki white box testers Zazvichaj unit testi zastosovuyut dlya togo shob upevnitisya sho kod vidpovidaye vimogam arhitekturi ta maye ochikuvanu povedinku PerevagiMetoyu modulnogo testuvannya ye izolyaciya kozhnoyi chastini programi ta vpevnenist u tomu sho kozhna okrema chastina ye korektnoyu Modulnij test zabezpechuye zhorstkij kontrakt za yakim maye pracyuvati testovanij kod Yak rezultat ce nadaye deyaki perevagi Modulne testuvannya dopomagaye znajti pomilki ranishe v cikli rozrobki PZ sho robit rozrobku deshevshoyu ta shvidshoyu Legkij refaktoring Modulne testuvannya dozvolyaye programistu koli vin bude zminyuvati kod provoditi refaktoring buti vpevnenim sho modul pracyuye virno ce regresivne testuvannya Oskilki modulne testuvannya vimagaye napisannya testiv dlya vsih funkcij ta metodiv u programi pomilki shvidko lokalizuyutsya ta vipravlyayutsya Sproshene integracijne testuvannya Modulne testuvannya mozhe buti zastosovane v integracijnomu testuvanni testuvannya okremih moduliv ta sukupnosti cih moduliv robit integracijne testuvannya legshim Odnak modulne testuvannya znizu vgoru ne ye integracijnim testuvannyam Integraciya z zovnishnimi modulyami maye vklyuchatisya do integracijnih testiv a ne do modulnih Dokumentuvannya Modulni testi yavlyayut soboyu specifichnij vid dokumentaciyi do sistemi Rozrobniki mozhut podivitisya na modulnij test shob diznatisya pro funkciyi sho vikonuye modul ta yak jogo zastosovuvati Unit test pereviryaye kritichni harakteristiki modulyu Vidpovidnist chi nevidpovidnist cim harakteristikam demonstruye korektnist modulya Modulnij test dokumentuye ci kritichni harakteristiki ale ne treba pokladatisya lishe na kod v dokumentuvanni PZ pid chas rozrobki Slid vidznachiti sho zvichajna pismova dokumentaciya duzhe povilno reaguye na zmini v kodi todi yak modulni testi zavzhdi vidobrazhayut potochnij stan modulya Rozrobka Pid chas rozrobki programnogo zabezpechennya metodom TDD Test driven development modulnij test staye chastinoyu rozrobki PZ Kozhen test viznachaye potribni klasi ta metodi yih ochikuvanu povedinku Navedenij nizhche priklad na movi Java dobre demonstruye vikoristannya unit testiv pid chas rozrobki metodom TDD Test klas za nazvoyu TestAdder viznachaye dekilka programnih elementiv sho povinni buti realizovani Po pershe u programi maye buti interfejs z nazvoyu Adder ta klas z nazvoyu AdderImpl sho jogo realizuye takozh maye buti konstruktor bez parametriv Interfejs Adder povinen mati metod add yakij prijmaye 2 parametri cili chisla i povertaye nazad takozh cile chislo Takozh cej kod viznachaye povedinku metodu add na nevelikomu nabori znachen public class TestAdder public void testSum Adder adder new AdderImpl assert adder add 1 1 2 assert adder add 1 2 3 assert adder add 2 2 4 assert adder add 0 0 0 assert adder add 1 2 3 assert adder add 1 1 0 assert adder add 1234 988 2222 U comu vipadku spochatku buv napisanij modulnij test a potim vzhe funkcionalnist yaku vin viznachaye Cej test viznachaye lishe povedinku majbutnogo metodu zalishayuchi tehnichni detali realizaciyi programistu Os metod sho vidpovidaye vimogam yaki postavleno testom interface Adder int add int a int b class AdderImpl implements Adder int add int a int b return a b Vazhlivoyu perevagoyu modulnogo testuvannya ye te sho testi odrazu demonstruyut vidpovidaye chi ne vidpovidaye realizaciya vimogam rozrobki Realizaciya z pomilkami skorishe za vse ne zmozhe projti modulni testi Vidokremlennya interfejsu vid realizaciyiPriznachennya modulnogo testu testuvannya yedinogo programnogo modulyu Ale chasto rozrobniki ta testuvalniki stvoryuyut testi sho ne vidpovidayut cij umovi U vipadku yaksho klas A mistit posilannya na klas V testuvannya klasu A peretikaye v testuvannya klasu V Rozglyanemo priklad Ye klas sho zalezhit vid bazi danih Modulni testi yaki pishutsya dlya nogo mozhut vzayemodiyati z BD shob viznachiti korektnist povedinki klasu Takij pidhid ye nekorektnim U takomu vipadku modulnij test vihodit za mezhi svoyeyi vidpovidalnosti za mezhi testovanogo klasu ta peretinaye mezhu inshogo klasu procesu komp yuternoyi merezhi Modulni testi sho napisani takim chinom peretvoryuyutsya na integracijni testi Koli ci testi perestayut pracyuvati vazhko lokalizuvati pomilku Pravilnim pidhodom mozhna vvazhati stvorennya abstraktnih interfejsiv dlya zapitiv do BD a realizuyutsya ci interfejsi za dopomogoyu mock ob yektiv fiktivnih ob yektiv Vzayemodiya unit testiv lishe z abstraktnimi interfejsami zabezpechuye retelnishe testuvannya Yak rezultat legshe ta deshevshe suprovodzhennya ObmezhennyaTestuvannya programnogo zabezpechennya ne mozhe znajti vsih pomilok u programi U bilshosti program nemozhlivo prorahuvati kozhen variant vikonannya Ce takozh virno dlya modulnogo testuvannya Krim togo modulne testuvannya vlasne povinne testuvati tilki moduli Tak sho cej vid testuvannya ne zmozhe znajti integracijni pomilki ta inshi pomilki arhitekturi problemi z vitrimkoyu navantazhen na PZ Unit testuvannya maye provoditis razom z inshimi vidami testuvannya programnogo zabezpechennya Yak i bud yakij vid testuvannya modulne testuvannya mozhe viznachiti lishe nayavnist pomilok a ne yih vidsutnist Testuvannya PZ ce kombinatorna zadacha Napriklad kozhne logichne sudzhennya povinno mati ne mensh dvoh testiv odin pereviryaye rezultat istinno a drugij hibno Vnaslidok cogo chasto na kozhnij ryadok kodu dovoditsya napisati vid 3 do 5 ryadkiv testu Ce vimagaye bagato chasu ta groshej yaki chasto ne varti rezultatu ZastosuvannyaEkstremalne programuvannya Modulne testuvannya ce narizhnij kamin ekstremalnogo programuvannya yake pokladayetsya na avtomatichne stvorennya testiv Avtomatichna generaciya testiv mozhe zdijsnyuvatis storonnimi bibliotekami yak to jUnit abo vlasnimi produktami kompaniyi rozrobnika Ekstremalne programuvannya vikoristovuye stvorennya modulnih testiv dlya test driven development Rozrobniki pishut modulni testi yaki viznachayut usi vimogi do programi Ci testi budut neuspishnimi yaksho potribni vimogi she ne realizovano abo yaksho realizaciya maye defekti Ekstremalne programuvannya dotrimuyetsya strategiyi testujte vse sho potencijno mozhe viklikati pomilku zamist tradicijnoyi testujte usi mozhlivi shlyahi vikonannya Tomu bilsha chastina kodu pokrita unit testami ale ne ves kod Vazhlivo vidznachiti sho kod testiv vvazhayetsya odnim z najvazhlivishih artefaktiv proektu bo suprovodzhuyetsya tak samo yakisno i v takomu zh obsyazi yak i funkcionalnij kod Rozrobniki vidpravlyayut kod testiv do repozitoriyu razom iz tim kodom sho voni testuyut Retelne testuvannya v ekstremalnomu programuvanni dozvolyaye legshe suprovodzhuvati kod provoditi jogo refaktoring integraciyu vesti dobru dokumentaciyu Ci modulni testi takozh pracyuyut yak forma regresivnogo testuvannya Tehnologiya Modulne testuvannya zazvichaj avtomatizuyut ale jogo mozhna provoditi j vruchnu IEEE ne nadaye perevagu yakomus z cih metodiv Meta modulnogo testuvannya izolyuvati modul ta viznachiti jogo korektnist Avtomatizovane testuvannya dozvolyaye zrobiti ce efektivno ta maye bagato perevag Yaksho testuvannya bulo pogano zaplanovano to neoberezhne ruchne testuvannya mozhe stati she j integracijnim testuvannyam sho pogano Shob povnistyu realizuvati efekt izolyaciyi modulya pid chas avtomatizovanogo testuvannya jogo kod vikonuyut u mezhah osoblivogo frejmvorku bez zv yazku z prirodnim seredovishem Inshimi slovami kod zapuskayut poza produktom abo kontekstom vikliku dlya yakogo jogo bulo napisano Takij sposib testuvannya pokazuye nevazhlivi zalezhnosti mizh kodom sho testuyetsya ta inshimi modulyami sistemi Vikoristovuyuchi frejmvork dlya modulnogo testuvannya rozrobnik zadaye kriteriyi za yakimi viznachayetsya uspishnist testu Pid chas vikonannya testuvannya frejmvork povidomlyaye pro testi sho ne zadovolnyayut kriteriyam Zalezhno vid vazhlivosti nevikonanogo testu frejmvork mozhe zupiniti podalshe testuvannya Yak naslidok modulne testuvannya tradicijno motivuye programistiv pisati kod iz menshoyu zv yaznistyu angl Coupling ta bilshoyu pov yazanistyu angl Cohesion Frejmvorki Frejmvorki dlya modulnogo testuvannya zazvichaj ne rozpovsyudzhuyutsya v komplekti z kompilyatorami ce programne zabezpechennya pishut okremo Voni rozrobleni dlya bagatoh mov programuvannya j dopomagayut sprostiti proces testuvannya Sered vidomih frejmvorkiv ye proekti open source napriklad ti sho zazvichaj nazivayut xUnit ta komercijni rishennya taki yak TBrun Testwell CTA and VectorCAST C Takozh mozhlivo vikonuvati modulne testuvannya bez dodatkovih bibliotek stvoryuyuchi kod sho zastosovuye mehanizmi assertion vinyatkovih situacij angl exception ta inshi mehanizmi kontrolyu vikonannya programi yaki mozhut signalizuvati pro neuspih Velikij perelik riznih frejmvorkiv ta yih harakteristik narazi dostupnij v anglomovnomu rozdili Vikipediyi en Pidtrimka modulnogo testuvannya na rivni movi Deyaki movi programuvannya pidtrimuyut modulne testuvannya bezposeredno Yih gramatika dozvolyaye vikoristannya modulnogo testuvannya bez importu dodatkovih bibliotek Movi sho pidtrimuyut modulne testuvannya Cobra D Java Priklad movoyu D class ABC this val 2 private int val public func val 2 unittest ABC a a func assert a val gt 0 amp amp a val lt 555 Mozhna zvernutisya do zakritoyi zminnoyi vseredini modulya Div takozhEkstremalne programuvannya Testuvannya programnogo zabezpechennya Test driven development jUnit frejmvork dlya Java z simejstva xUnit PrimitkiKolawa Adam Huizinga Dorota 2007 Wiley IEEE Computer Society Press s 75 ISBN 0470042125 Arhiv originalu za 25 kvitnya 2012 Procitovano 23 zhovtnya 2011 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a Vkazano bilsh nizh odin pages ta page dovidka 20 veresnya 2007 Alberto Savoia sings the praises of software testing Arhiv originalu za 16 lipnya 2013 Procitovano 29 listopada 2007 IEEE Standards Board IEEE Standard for Software Unit Testing An American National Standard ANSI IEEE Std 1008 1987 30 zhovtnya 2007 u Wayback Machine in IEEE Standards Software Engineering Volume Two Process Standards 1999 Edition published by The Institute of Electrical and Electronics Engineers Inc Software Engineering Technical Committee of the IEEE Computer Society PosilannyaUnit Testing Guidelines from GeoSoft 10 kvitnya 2009 u Wayback Machine Test Driven Development Ward Cunningham s Wiki 12 travnya 2011 u Wayback Machine Unit Testing 101 for the Non Programmer 19 sichnya 2022 u Wayback Machine Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi