Unit test — dasturiy ta’minotning kichik, mantiqan ajratilgan birligi kutilgan xatti-harakatni berishini tez va avtomatik tekshiradigan testdir. Unit funksiya, sinf yoki komponent bo‘lishi mumkin; aniq chegara til va dizaynga bog‘liq. Asosiy xususiyat — test natijasi tashqi tarmoq, real database va boshqa beqaror tizimlardan izolyatsiya qilingan bo‘lishidir.
Tuzilishi
Arrange bosqichida kirish va dependencylar tayyorlanadi, Act’da bitta kuzatiladigan amal bajariladi, Assert’da natija yoki yon ta’sir tekshiriladi. Bu qat’iy sintaksis emas, test niyatini o‘qishni osonlashtiruvchi tartib. Test nomi berilgan shart, amal va natijani ifodalashi mumkin.
Bir test faqat bitta assertga ega bo‘lishi shart emas. Bitta xatti-harakatning bog‘liq natijalari, masalan, status va qaytgan qiymat birga tekshiriladi. Muhimi, muvaffaqiyatsizlik sababi aniq bo‘lsin va test bir nechta mustaqil ssenariyni aralashtirmasin.
Test double
Stub oldindan javob beradi, spy chaqiriqlarni qayd etadi, mock kutilgan hamkorlikni tekshiradi, fake esa soddalashtirilgan ishlaydigan implementatsiya beradi. Har dependency’ni mock qilish testni implementation detailga bog‘lab qo‘yadi. Pure hisoblashda real obyekt, sekin yoki nondeterministic boundary’da test double ishlatiladi.
Vaqt, random, UUID va global environment dependency sifatida uzatilsa test deterministik bo‘ladi. Fake clock timeout va muddatni real kutmasdan tekshiradi. Seedlangan random property testni takrorlash imkonini beradi.
Sifat xususiyatlari
Unit test tez, mustaqil va takrorlanuvchi bo‘ladi. Bajarilish tartibiga, oldingi test qoldig‘iga yoki lokal timezonega bog‘liq test flaky hisoblanadi. Shared mutable fixture har testdan oldin yangidan yaratiladi. Parallel runnerda global port va fayl nomi to‘qnashmasligi kerak.
Coverage bajarilgan qator yoki branch ulushini ko‘rsatadi, lekin assert sifati va muhim talabni o‘lchamaydi. 100 foiz coverage bilan ham noto‘g‘ri natijani tasdiqlovchi test bo‘lishi mumkin. Mutation testing kodga kichik xato kiritib, test uni ushlaydimi tekshiradi.
Test chegarasi
Unit test integratsiya, contract va end-to-end test o‘rnini bosmaydi. Serializer, SQL mapping yoki tarmoq protokoli real boundary bilan alohida tekshiriladi. Test piramidasi ko‘p tez unit test va kamroq qimmat keng testdan foydalanadi, ammo taqsimot mahsulot riskiga moslanadi.
Refactoringda ichki private metodlarni bevosita testlash o‘rniga public contract saqlanadi. Test implementation ketma-ketligini ortiqcha tekshirsa to‘g‘ri refactoring ham uni buzadi. Bug topilganda avval uni takrorlaydigan test yozilib, tuzatishdan keyin regression sifatida qoladi. Test kodi ham production kodi kabi review va soddalashtirish talab qiladi.
Parallel va parametrli test
Bir xil qoidani ko‘p inputda tekshirish uchun parametrli test qiymat va kutilgan natijani jadvalda beradi. Har case nomi diagnostikada ko‘rinadi. Minglab case biznes qoidasini yashirsa property-based test invariant va generator bilan yaxshiroq bo‘lishi mumkin. Parallel bajarilish suite vaqtini kamaytiradi, lekin testlar global environment, process locale, fixed port yoki bir xil faylga tayanmasligi kerak. Har test vaqtinchalik katalog va mustaqil dependency oladi. Random tartib yashirin bog‘liqlikni topadi, seed esa muvaffaqiyatsizlikni takrorlash uchun saqlanadi. Flaky testni cheksiz retry bilan yashirish o‘rniga sabab topilib, vaqtincha karantinning egasi va muddati belgilanadi.
Yaxshi unit test muvaffaqiyatsizlik sababini tez ko‘rsatadi. Nomida tekshirilayotgan holat va kutilgan xatti-harakat aks etishi, tasdiqlar esa ortiqcha tafsilotlarga emas, kuzatiladigan natijaga qaratilishi kerak.
Bog‘liq tushunchalar
Test double, Mock, Test fixture, Code coverage, Integration test, Regression test