Bosh sahifa Wiki Test double

Test double

Test double — test davomida productiondagi haqiqiy hamkor komponent o‘rnini bosadigan obyekt yoki modul uchun umumiy atama. Kino sahnasidagi dublyor analogiyasidan olingan. Test double tashqi tizimni ajratish, qiyin holatni boshqariladigan tarzda yaratish, testni tezlashtirish yoki interactionni kuzatish uchun ishlatiladi. Mock, stub, spy, fake va dummy uning turli vazifali ko‘rinishlaridir.

Asosiy turlari

  • Dummy argument ro‘yxatini to‘ldiradi, lekin testda amalda ishlatilmaydi.
  • Stub oldindan belgilangan qiymat yoki xatoni qaytaradi.
  • Spy haqiqiy yoki soddalashtirilgan xulq bilan birga chaqiruvlarni qayd etadi.
  • Mock kutilgan interactionlarni belgilaydi va ularni tekshiradi.
  • Fake ishlaydigan, ammo productionga mos bo‘lmagan soddalashtirilgan implementatsiyadir.

Frameworklar bu nomlarni har doim qat’iy ajratmaydi. “Mock librarystub va spy ham yaratishi mumkin. Maqola yoki test nomida obyektning vazifasini ko‘rsatish noaniqlikni kamaytiradi.

Seam va dependency injection

Haqiqiy dependency o‘rniga double berish uchun kodda almashtirish nuqtasi — seam bo‘lishi kerak. Constructor injection, function parameter yoki interface bu vazifani bajaradi. Production kod modul ichida bevosita global client yaratsa, test uni patch qilishga majbur bo‘ladi va test import tartibiga bog‘lanadi.

Interface juda katta bo‘lsa double ko‘p metodni yasashni talab qiladi. Consumerga kerakli kichik portni ajratish testni va dizaynni soddalashtiradi. Biroq faqat test uchun keraksiz abstraksiya yaratish ham murakkablik qo‘shadi.

Deterministik ssenariylar

Double vaqt, random, tarmoq va fayl tizimi kabi beqaror dependencylarni nazorat qiladi. Clock double ma’lum vaqtni qaytaradi, stub API 429 xatosini beradi, fake repository xotirada yozuv saqlaydi. Shu tariqa kam uchraydigan branch qayta ishlab chiqariladi.

Nazorat qilish real xatti-harakatni haddan tashqari soddalashtirmasligi kerak. In-memory fake database transaction isolation, collation yoki constraintlarni aynan takrorlamasligi mumkin. Shu xususiyatga bog‘liq kod haqiqiy baza bilan integration testda tekshiriladi.

Chegara va ishonch

Double test qilinayotgan komponentga tegishli bo‘lmagan dependency uchun ishlatiladi. System under testning o‘zini mock qilish maqsadni yo‘qotadi. Ichki classlar zanjirini to‘liq mocklash implementation-coupled test hosil qiladi.

Tashqi servis double’i lokal taxminni ifodalaydi. Provider schema yoki status semantikasini o‘zgartirsa, double avtomatik yangilanmaydi. Consumer-driven contract va davriy integration test double bilan real API orasidagi driftni aniqlaydi.

Test isolation

Double instance’i har testda mustaqil bo‘lishi, state va call history boshqa testga o‘tmasligi kerak. Fake database teardown yoki transaction rollback bilan tozalanadi. Parallel test bir xil fayl, port yoki singleton doublega yozsa poyga holati yuz beradi.

Test double tarmoq va tashqi xarajatni olib tashlagani uchun unit test tez ishlaydi. Biroq unit testlar sonining ko‘pligi end-to-end kafolat bermaydi; test piramidasi turli darajalarni birgalikda qo‘llaydi.

Dummy va null object

Dummy obyekt metod chaqirilishi kutilmagan, faqat signature talab qilgani uchun uzatiladigan qiymatdir. Agar kod undan foydalansa, test darhol xato beradigan dummy bu yashirin dependency’ni ko‘rsatadi. Null Object esa interface’ni haqiqiy, zararsiz “hech narsa qilmaslik” xulqi bilan implement qiladi va productionda ham ishlatilishi mumkin; shu sababli u har doim test double emas.

Simulator bilan farqi

Simulator haqiqiy tizimning vaqt, protokol yoki fizik modelini ancha batafsil takrorlaydi. Fake esa odatda faqat testga zarur semantikani beradi. Simulator aniqligi yuqori bo‘lsa ham, uning modeli ham tekshirilishi va real qurilma bilan kalibrlanishi kerak.

Bog‘liq tushunchalar

Mock object, Stub, Spy, Fake, Dummy object, Dependency injection