Testlərin təşkili: tag-lar, hook-lar, addımlar, annotasiyalar
20 test ilə təşkilat lazım deyil; 500 test ilə təşkilatsızlıq suite-i idarəolunmaz edir.
Qruplaşdırma: test.describe('Checkout') blokları faylı məntiqi bölür və hesabatda iyerarxiya yaradır. Nested describe mümkündür, amma 2 səviyyədən dərinə getmək oxunaqlığı azaldır. test.describe.configure({ mode: 'serial' }) — testləri ardıcıl və asılı edir (biri sınsa, qalanı skip olunur); bu, son çarədir, çünki paralelliyi və müstəqilliyi öldürür. mode: 'parallel' isə eyni fayldakı testləri də paralel işlədir.
Tag-lar və seçmə icra: müasir sintaksis test('...', { tag: ['@smoke', '@critical'] }, async ({ page }) => ...); adda @smoke yazmaq da işləyir. İcra: --grep @smoke, --grep-invert @slow, məntiqi ifadə: --grep "@smoke|@critical". Praktik tag dəsti: @smoke (PR-da işləyən kritik minimum), @regression, @slow, @flaky (quarantine), @wip.
Seçmə icranın əsas dəyəri: PR-da 5 dəqiqəlik smoke, nightly-də tam regression — yəni developer sürətli feedback alır, komanda isə geniş əhatəni itirmir.
Hook-lar və fixture-lər — çox verilən müqayisə sualı:
beforeEach/afterEach— sadə, imperativ, hamıya tanış. Problem: describe blokundakı BÜTÜN testlərə tətbiq olunur (lazım olmasa da), tiplənmir və kompozisiya olunmur.- Fixture — deklarativdir: test hansı fixture-i istəyirsə, arqumentdə sadalayır; yalnız o zaman işə düşür. Tipli, kompozisiya olunan (fixture fixture-dən asılı ola bilər), teardown-ı zəmanətli.
Praktik qayda: resurs və data → fixture; sadə, universal hazırlıq → hook. Məsələn, hər testdə page.goto('/') üçün beforeEach normaldır; user yaratmaq üçün mütləq fixture.
Annotasiyalar — testin vəziyyətini KODDA sənədləşdirir:
test.skip()— müvəqqəti söndürmə; həmişə səbəb və ticket ilətest.fixme()— test və ya funksionallıq sınıqdır, düzəliş gözlənilir (skip-dən fərqi: niyyət açıqdır)test.fail()— testin sınMASI GÖZLƏNİLİR; keçsə, əksinə, fail olur — məlum bug üçün idealtest.slow()— timeout-u 3 dəfə artırır (silmək əvəzinə)test.only()— yalnız lokal debugging üçün; lint ilə main-ə düşməsi bloklanmalıdırtest.describe.configure({ retries: 2 })— yalnız konkret qrup üçün retry
test.step() isə testin İÇİNİ strukturlaşdırır: hesabatda və trace-də adlandırılmış mərhələlər görünür.
| Annotasiya | Mənası | Nə vaxt istifadə et |
|---|---|---|
| test.skip(reason) | Test işlədilmir | Şərt ödənmir (məs. feature bu mühitdə yoxdur) — səbəb yazılmalıdır |
| test.fixme(reason) | Test sınıqdır, düzəliş gözlənilir | Quarantine — ticket linki ilə birlikdə |
| test.fail() | Fail GÖZLƏNİLİR; keçərsə xəbərdarlıq verir | Məlum, hələ düzəlməmiş product bug — düzələn kimi xəbər tutursan |
| test.slow() | Timeout 3x artır | Obyektiv uzun axın (hesabat generasiyası, batch job) |
| test.only() | Yalnız bu test işləyir | Lokal debugging; main-ə düşməsi lint ilə bloklanmalıdır |
İnterview-da güclü göstərici: test.skip() ilə test.fail() fərqini bilmək. skip problemi gizlədir — test işləmir və heç kim onu xatırlamır; fail isə problemi izləyir — bug düzələn kimi test "gözlənilmədən keçdi" deyə xəbər verir. Cavabında əlavə et: bizdə skip həmişə ticket linki ilə gəlir, əks halda quarantine daimi qəbiristanlığa çevrilir.
📚 Mənbələr və sənədlər
- Annotasiyalarrəsmiplaywright.dev
- Project-lərrəsmiplaywright.dev