Fake — production interfeysiga mos, amalda ishlaydigan, ammo soddalashtirilganligi sabab production uchun mo‘ljallanmagan test implementatsiyasi. Masalan, haqiqiy SQL repository o‘rnidagi in-memory repository yoki tashqi email server o‘rnidagi xotirada xabar yig‘uvchi fake xizmat. Fake oddiy stubdan farqli ravishda turli chaqiruvlar orasida holat va foydali biznes xulqini saqlashi mumkin.
Soddalashtirilgan implementatsiya
Fake ma’lumot qo‘shish, o‘qish va o‘chirishni haqiqiy interface orqali bajaradi. Test har chaqiruv uchun alohida javob yozmaydi; fake ichki qoidalar asosida natija hosil qiladi. Bu ko‘p scenario va state transitionni tez tekshirishga imkon beradi.
Soddalashtirishning misollari:
- disk bazasi o‘rniga dictionary yoki list;
- real SMTP o‘rniga yuborilgan xabarlar kolleksiyasi;
- cloud object storage o‘rniga vaqtinchalik katalog;
- navbat brokeri o‘rniga process ichidagi queue;
- haqiqiy clock o‘rniga qo‘lda oldinga suriladigan fake clock.
Semantik tafovut
In-memory fake database haqiqiy bazaning transaction isolation, foreign key, collation, SQL NULL, index va concurrency xatti-harakatini to‘liq takrorlamaydi. List ichidagi qidiruv insertion orderni saqlashi, SQL esa ORDER BY bo‘lmasa tartib kafolatlamasligi mumkin. Test fake bilan o‘tib, productionda shu farq sabab buziladi.
Fake qaysi kafolatlarni beradi va qaysilarini bermasligi hujjatlashtiriladi. Muhim database xususiyatlari containerdagi haqiqiy engine bilan integration testda tekshiriladi. Fake production implementatsiyaning mustaqil qayta yozilgan nusxasiga aylansa, uni saqlash xarajati va drift ortadi.
Contractga moslik
Bir interface uchun fake va production implementatsiya umumiy contract test suite’dan o‘tishi mumkin. Masalan, mavjud bo‘lmagan ID uchun qaytish, duplicate key xatosi va update semantikasi ikkalasida bir xil tekshiriladi. Bu fakedagi ochiq tafovutlarni kamaytiradi.
Shunga qaramay, contract faqat yozilgan qoidalarni tekshiradi. Performance, deadlock va vendor-specific xususiyatlar fake bilan qamrab olinmaydi. Fake tez unit/component test uchun, real dependency esa tanlangan integration test uchun ishlatiladi.
Holat va isolation
Fake state testlar orasida tozalanadi. Singleton fake parallel testlarda ma’lumot aralashishiga olib keladi. Har test yangi instance yaratishi yoki namespace bilan ajratishi mumkin. Vaqtga bog‘liq fake clock ham boshlang‘ich vaqti aniq qilib qayta o‘rnatiladi.
Concurrency testi uchun oddiy dictionary yetarli bo‘lmasligi mumkin. Fake thread-safe qilinsa ham, haqiqiy distributed store konflikt semantikasini bermaydi. Bunday test maxsus simulator yoki real tizimga muhtoj.
Fake server
HTTP fake server haqiqiy socketda protokol javoblarini bera oladi. Bu serialization, timeout va client routingni method mockdan ko‘proq qamrab oladi. Ammo u providerning haqiqiy validatsiya va edge-case’larini faqat yozilgan darajada takrorlaydi. Provider sandboxi yoki contract test driftni aniqlaydi.
Fake maxfiy credential va tashqi xarajat talab qilmagani uchun CI da deterministik. Production konfiguratsiyada tasodifan fake implementatsiya yoqilmasligi uchun dependency wiring va environment validatsiyasi qo‘llanadi.
Error injection
Fake odatiy muvaffaqiyatli xulq bilan cheklanmay, boshqariladigan nosozlik rejimini berishi mumkin. Masalan, navbat fake’i uchinchi publishda xato chiqaradi yoki storage fake’i quota tugaganini bildiradi. Nosozlik aniq test konfiguratsiyasi bilan yoqiladi; yashirin tasodif ishlatilmaydi.
Fake’ning xato turlari real interfeys contractiga mos bo‘ladi. Production client timeoutni maxsus exceptionga aylantirsa, fake boshqa umumiy exception chiqarmaydi. Shu moslik retry va error mapping testini ma’noli qiladi.
Bog‘liq tushunchalar
Test double, In-memory database, Stub, Mock object, Contract testing, Test isolation