Test discovery — test runnerning loyiha ichidan bajarilishi kerak bo‘lgan test moduli, classi va funksiyalarini avtomatik topish jarayonidir. Runner katalog yo‘li, fayl nomi, Python obyekt nomi, annotation yoki konfiguratsiya kabi qoidalarni qo‘llab, collection ro‘yxatini tuzadi. Discovery testni bajarishdan oldingi alohida bosqichdir.
Nomlash qoidalari
Pytest odatiy sozlamada test_*.py va *_test.py fayllarini, ichidagi test_ bilan boshlangan funksiyalarni hamda mos test classlarini yig‘adi. unittest discover esa boshlang‘ich katalog va test*.py patternidan foydalanadi. Boshqa runnerlar annotation, manifest yoki build targetga tayanishi mumkin.
Nomlash convention’ga mos kelmagan test fayli syntax jihatdan to‘g‘ri bo‘lsa ham collectionga kirmaydi. Bu eng xavfli holatlardan biri: CI yashil chiqadi, lekin kerakli test bajarilmagan bo‘ladi. Runner topgan testlar soni va collect-only ro‘yxati kutilgan inventory bilan solishtiriladi.
Collection bosqichi
Runner avval candidate fayllarni topadi, keyin modullarni import qilib test obyektlarini aniqlaydi. Python modulining top-level kodi import vaqtida bajariladi. U tarmoqqa ulansa, environment variable talab qilsa yoki database ochsa, test body boshlanmasdan collection failure yuz beradi. Import side effectni kamaytirish discoveryni tez va ishonchli qiladi.
Soddalashtirilgan ketma-ketlik:
- root directory va konfiguratsiyani aniqlash;
- include hamda exclude patternlarni qo‘llash;
- candidate modullarni import qilish;
- test node va parametr variantlarini yaratish;
- marker yoki selector bo‘yicha yakuniy ro‘yxatni filtrlash.
Parametrized test bitta funksiya bo‘lsa ham collectionda ko‘p test node hosil qiladi. Shu sabab “fayldagi funksiyalar soni” bilan “bajarilgan testlar soni” bir xil bo‘lmaydi.
Paket va import yo‘llari
Project root noto‘g‘ri aniqlansa bir xil nomli boshqa modul import qilinishi mumkin. src layout, editable install va PYTHONPATH sozlamasi local hamda CI muhitida mos bo‘lishi kerak. Test katalogini package qilish yoki qilmaslik relative import semantikasiga ta’sir etadi.
Bir faylga ikki yo‘l orqali yetib borilsa duplicate collection yuz berishi mumkin. Symlink, noto‘g‘ri recursive path yoki bir nechta test target bir testni qayta yig‘adi. Node ID va file path hisobotlari buni aniqlashga yordam beradi.
Tanlab bajarish
Runner path, node ID, nom expression, marker yoki tag yordamida subset tanlaydi. Masalan, tez unit testlar va tashqi service talab qiladigan integration testlar marker bilan ajratiladi. Marker ro‘yxatdan o‘tkazilmasa typo sabab test kutilmagan guruhga tushishi mumkin; strict marker rejimi bunday xatoni collection vaqtida rad etadi.
Ignore pattern generated code, virtual environment va katta fixture kataloglarini traversal’dan chiqaradi. Juda keng exclude yangi test katalogini ham yashirishi mumkin. Konfiguratsiya o‘zgarganda collect-only natijasi ko‘rib chiqiladi.
Dinamik discovery va pluginlar
Plugin collection hook orqali custom fayl turi yoki test obyektini runnerga tanitishi mumkin. Masalan, YAML scenario yoki notebook cell test nodega aylantiriladi. Custom collector har node uchun barqaror ID, source location va tushunarli failure berishi kerak. Aks holda parallel taqsimlash va rerun mexanizmi beqaror bo‘ladi.
Dynamic test generation tashqi holatga bog‘lanmasligi ma’qul. Collection paytida real API dan case olish tarmoq uzilganda butun suite’ni topilmas holga keltiradi. Zarur dataset versionlangan fixture yoki oldindan yaratilgan manifestda saqlanadi.
CI tekshiruvi
CI logida collected, selected, deselected va skipped testlar soni alohida ko‘rsatiladi. Nol test topilishi ko‘pincha muvaffaqiyat emas, konfiguratsiya xatosi sifatida qaytariladi. Shardlangan bajarishda har shardning selector qoidasi barcha testlarni aynan bir marta qamrab olishi tekshiriladi.
Discovery tezligi ham muhim: minglab modul importi va og‘ir top-level setup pipeline vaqtini oshiradi. Cache yordam berishi mumkin, ammo konfiguratsiya yoki dependency o‘zgarganda cache invalidation to‘g‘ri ishlashi kerak. Aniq convention va yengil import jarayoni test to‘plamining ko‘rinuvchanligini saqlaydi.
Bog‘liq tushunchalar
Test runner, Test collection, pytest, unittest, Naming convention, Marker, Parametrized testing