Test lifecycle — test runner testlarni topishdan boshlab muhitni tayyorlash, test body’ni bajarish, resurslarni yopish va natijani hisobot qilishgacha o‘tadigan bosqichlar ketma-ketligidir. Lifecycle qoidalari fixture scope’i, hook tartibi, failure semantikasi va parallel bajarishda state qanday ajratilishini belgilaydi.
Asosiy bosqichlar
Odatdagi jarayon quyidagi tartibda kechadi:
- konfiguratsiya va pluginlarni yuklash;
- test discovery hamda collection;
- suite yoki class scope setup;
- har test uchun setup, body va teardown;
- suite scope cleanup;
- natijalarni birlashtirish va exit code qaytarish.
Collection paytida modul importi yoki parametr generation bajarilishi mumkin. Shu bosqichdagi xato test failure emas, collection error hisoblanadi. Nol test topilishi ayrim runnerda muvaffaqiyatli exit bo‘lishi mumkin, CI esa uni konfiguratsiya xatosi sifatida rad etishi kerak.
Setup va teardown
Setup testga kerakli object, vaqtinchalik katalog, transaction yoki clientni tayyorlaydi. Teardown ochilgan resurslarni body muvaffaqiyatli bo‘lsa ham, assertion yiqilsa ham yopadi. try/finally, context manager yoki framework fixture finalizeri cleanupni kafolatlashga yordam beradi.
Setup qisman muvaffaqiyatli bo‘lib keyin xato bersa, avval ochilgan resurslar baribir yopilishi kerak. Runner qaysi teardown hooklarni chaqirishi framework hujjatida belgilanadi. Resurs acquisition bir joyda yig‘ilsa yarim holatni tozalash osonlashadi.
Scope
Function scope har test uchun yangi fixture beradi va kuchli izolyatsiya yaratadi. Class, module yoki session scope qimmat resursni ulashib, test vaqtini kamaytiradi. Biroq shared mutable state test tartibiga bog‘liqlik va parallel race keltirib chiqaradi.
Database server session scope’da ishlashi, har test esa alohida transaction yoki schema olishi mumkin. Shu tariqa startup xarajati ulashiladi, yozuv holati esa ajratiladi. Scope kattalashtirilganda reset mexanizmi va failuredan keyingi cleanup alohida tekshiriladi.
Hook tartibi va xatolar
Nested hooklarda tashqi setup avval, ichki setup keyin ishlashi; teardown esa teskari tartibda yopilishi odatiy. Hook tartibiga yashirin bog‘lanish testni boshqa packagega ko‘chirganda buziladi. Zarur dependency explicit fixture parametrida ko‘rsatiladi.
Body va teardown ikkalasi xato bersa, hisobot ikkala failure’ni saqlashi kerak. Cleanup xatosi asosiy assertionni yashirmaydi. Skip setupdan oldin yoki keyin qo‘llanishiga qarab resurs yaratilishi mumkin; conditional skip imkon qadar acquisitiondan avval baholanadi.
Parallel lifecycle
Parallel runner class, method yoki process darajasida testlarni taqsimlaydi. Global beforeAll amalda har worker processida bir marta ishlashi mumkin. Port, fayl va schema worker ID bilan ajratiladi. Thread-local state asynchronous tasklar orasida avtomatik ko‘chmasligi mumkin.
Test timeout bo‘lsa runner faqat bodyni to‘xtatishi yoki butun workerni tugatishi mumkin. Threadni majburan to‘xtatish lock va shared resursni buzadi. Cooperative cancellation, bounded wait va process isolation xavfsizroq lifecycle beradi.
Hisobot va yakuniy holat
Runner passed, failed, skipped, aborted va error holatlarini ajratadi. Retry original failureni yo‘qotmasdan attempt tarixini saqlaydi. Flaky test oxirgi urinishda o‘tsa ham alohida ko‘rsatkich bo‘lib qoladi.
Suite yakunida ochiq thread, task, socket yoki temp artifact tekshirilishi mumkin. Exit code CIga umumiy holatni uzatadi. Report test ID, duration, parametr, stdout va stack trace bilan diagnostika beradi, lekin secretlarni sanitization qiladi.
Bog‘liq tushunchalar
Test runner, Setup, Teardown, Fixture scope, Test hook, Test discovery, Parallel testing