Bosh sahifa Wiki Test hook

Test hook

Test hooktest runner hayot siklining belgilangan nuqtasida avtomatik chaqiriladigan funksiya yoki kengaytma nuqtasidir. Hook testdan oldin muhit tayyorlash, testdan keyin resurslarni yopish, natijani qayd etish yoki collection jarayonini o‘zgartirish uchun ishlatiladi. Uning aniq nomi va scope’i frameworkga bog‘liq.

Hayot siklidagi o‘rni

Ko‘p runnerlarda suite boshlanishi, har test boshlanishi, test body tugashi va suite yakunlanishi uchun alohida hooklar mavjud. JavaScript runnerlarida beforeAll, beforeEach, afterEach, afterAll; Python unittestda setUp, tearDown, setUpClass, tearDownClass shu modelning ko‘rinishlaridir. Pytest fixture va plugin hooklari yanada umumiy dependency va collection boshqaruvini beradi.

Scope resursning umrini belgilaydi. Har test uchun yangi database transaction kuchli izolyatsiya beradi. Bitta suite uchun umumiy test server esa ishga tushirish xarajatini kamaytiradi, lekin testlar o‘rtasida state qolmasligini alohida ta’minlash kerak.

Bajarilish tartibi

Bir nechta hook bo‘lsa, runner ularning nesting yoki ro‘yxatdan o‘tish tartibini belgilaydi. Odatda tashqi setup avval, ichki setup keyin bajariladi; teardown esa teskarisiga yuradi. Bu resurslar stack kabi ochilib-yopilishiga mos keladi:

suite setup → test setup → test body → test teardown → suite teardown

Tartibga yashirin bog‘lanish testlarni ko‘chirganda buzilishi mumkin. Zarur dependency aniq fixture parametri yoki helper orqali ifodalansa, hooklarning tasodifiy ro‘yxat tartibiga ehtiyoj kamayadi.

Xato va tozalash semantikasi

Setup hook xato bersa, test body odatda bajarilmaydi. Shunga qaramay, avval muvaffaqiyatli ochilgan resurslar yopilishi kerak. Runner qaysi teardownlar chaqirilishini hujjatlashtiradi; custom hook try/finally yoki context manager yordamida yarim tayyor holatni ham tozalaydi.

Teardown xatosi test body xatosini yashirib yubormasligi kerak. Hisobot asosiy failure va cleanup failure’ni alohida saqlasa, diagnostika aniq bo‘ladi. Hook ichida juda keng exception ushlash testni yolg‘on muvaffaqiyatli ko‘rsatishi mumkin.

Asinxron hook qaytargan promise yoki coroutine runner tomonidan kutiladi. Callback va promise usullarini bir hookda aralashtirish ikki marta tugash yoki umuman tugamaslikka sabab bo‘ladi. Timeout setup, test va teardown bosqichlari uchun alohida ko‘rsatilishi mumkin.

Umumiy holat va parallel bajarish

Global mutable state hooklarning asosiy xavflaridan biridir. beforeAll ichida yaratilgan obyekt parallel testlarda bir vaqtda o‘zgarsa race condition paydo bo‘ladi. Read-only fixture ulashish mumkin, yoziladigan state esa test bo‘yicha ajratiladi yoki synchronization bilan himoyalanadi.

Parallel workerlar ko‘pincha o‘z processiga ega. Suite hook bir marta emas, har workerda bir marta bajarilishi mumkin. Port, schema va vaqtinchalik fayl nomlari worker identifikatori bilan ajratilmasa collision yuz beradi. Runner semantikasini bilmasdan hookni “global bir marta” deb qabul qilish noto‘g‘ri.

Plugin va kuzatuv hooklari

Framework pluginlari test collection, marker tahlili, parametr yaratish, execution natijasi va report formatiga ulanadigan hooklarni beradi. Kuzatuv hooki duration, log yoki trace yig‘ishi mumkin, lekin test natijasini o‘zgartirmasligi ma’qul. Maxfiy token va shaxsiy ma’lumot logga tushmasligi uchun sanitization qo‘llanadi.

Hooklar qisqa, deterministik va bitta lifecycle vazifasiga yo‘naltirilganda testlar o‘qilishi oson bo‘ladi. Katta business workflow setupga yashirilsa, test body nimani tekshirayotgani noaniqlashadi va failure qaysi bosqichda yuz berganini ajratish qiyinlashadi.

Bog‘liq tushunchalar

Test runner, Fixture, Setup, Teardown, Test lifecycle, Plugin, Parallel testing