Bosh sahifa Wiki Unit testing

Unit testing

Unit testing — dasturiy tizimning kichik, mantiqan ajratilgan birligini tez va boshqariladigan sharoitda tekshirish usuli. Unit funksiya, class, modul yoki aniq xulqli komponent bo‘lishi mumkin; uning hajmini dasturlash tili emas, test isolation chegarasi belgilaydi. Unit test odatda tarmoq, real database va tashqi servislarni chetlab, kodning lokal qoidalariga tez javob beradi.

Test tuzilishi

Keng tarqalgan Arrange–Act–Assert shakli uch bosqichdan iborat:

  1. Arrange kirish ma’lumoti va dependencylarni tayyorlaydi.
  2. Act tekshirilayotgan bitta xulqni ishga tushiradi.
  3. Assert kuzatilgan natijani kutilgan qiymat bilan solishtiradi.

Test nomi scenario va kutilgan natijani ifodalaydi. Bir testda ko‘p assertion bo‘lishi mumkin, agar ular bitta xulqning yaxlit natijasini tekshirsa. Bir-biriga aloqasiz scenario bitta testga yig‘ilsa, xato sababi noaniq bo‘ladi.

Isolation

Unit test boshqa testga, real vaqtga, tasodifiy tarmoqqa yoki umumiy state’ga bog‘lanmaydi. Dependency injection orqali repository, clock yoki gateway test double bilan almashtiriladi. Pure functionlar uchun hech qanday double kerak emas; input va output yetarli.

Har bir dependency’ni mock qilish shart emas. Value object va oddiy ichki classlarni haqiqiy ishlatish testni xulqqa yaqin tutadi. Faqat sekin, nondeterministik yoki unit chegarasidan tashqaridagi hamkor ajratiladi.

State va interaction assertion

State-based test qaytgan qiymat, obyekt holati yoki chiqarilgan domen natijasini tekshiradi. Interaction test muhim hamkor chaqiruvini, masalan payment gateway bir marta chaqirilganini tasdiqlaydi. Ichki metodlar ketma-ketligini tekshirish refactor paytida testni asossiz sindirishi mumkin.

Exception, boundary value va noto‘g‘ri input alohida scenario hisoblanadi. Parametrized test bir xil qoida uchun ko‘p inputni ixcham beradi. Property-based testing ayrim universal invariantlarni ko‘plab generatsiya qilingan qiymatda tekshirishi mumkin.

Tezlik va deterministik natija

Unit testlar millisekundlarda ishlashi va tez-tez bajarilishi kutiladi. Real sleep o‘rniga fake clock, random uchun aniq seed yoki dependency ishlatiladi. Async kod testida task tugashi signal orqali kutiladi; qat’iy vaqt kutish flaky testga olib keladi.

Global cache, singleton va environment variable test boshlanishida nazorat qilinadi. Parallel runner bir xil fayl yoki portdan foydalansa isolation buziladi. Test teardown asl xatoni yashirmasdan resursni tozalaydi.

Qamrov chegarasi

Code coverage qaysi satr yoki branch bajarilganini ko‘rsatadi, to‘g‘ri assertion mavjudligini emas. 100 foiz coverage noto‘g‘ri talab yoki integratsion xatoni istisno qilmaydi. Mutation testing kodga kichik o‘zgarish kiritib, test uni ushlaydimi tekshirishi mumkin.

Unit test serialization, database constraint, tarmoq protokoli va deploy konfiguratsiyasini to‘liq tekshirmaydi. Integration, contract va end-to-end testlar shu chegaralarni qamrab oladi. Turli darajalar bir-birini almashtirmaydi.

Fixture hajmi

Katta umumiy fixture har testga keraksiz obyektlar yaratib, qaysi qiymat scenario uchun muhimligini yashiradi. Test data builder faqat farqlanuvchi maydonlarni ko‘rsatib, qolganiga ma’noli default beradi. Defaultlar biznes qoidasi o‘zgarganda markaziy yangilanadi, ammo assertion aynan defaultning tasodifiy qiymatiga tayanmaydi.

Test va production kodi

Test ham kod bo‘lgani uchun naming, duplication va review talab qiladi. Biroq testni haddan tashqari abstraksiyalash Arrange bosqichini yashiradi. Helper xatoni o‘z ichida yutmasligi va assertion message scenario haqida yetarli ma’lumot berishi kerak. Production bug tuzatilganda avval uni qayta ko‘rsatuvchi regression unit test qo‘shiladi.

Bog‘liq tushunchalar

Test isolation, Test double, Assertion, Code coverage, Integration testing, Mutation testing