JSON və data ilə iş
JSON — API testlərinin dilidir. İki funksiya kifayət edir:
JSON.parse(mətn)— JSON sətrini JavaScript obyektinə çevirirJSON.stringify(obyekt)— obyekti JSON sətrinə çevirir; ikinci və üçüncü arqumentlə oxunaqlı format alınır:JSON.stringify(obj, null, 2)
Praktikada Playwright-ın response.json() metodu parse-ı özü edir — əl ilə JSON.parse çağırmağa çox vaxt ehtiyac qalmır. JSON.parse düz mətnlə işlədikdə (fayldan oxunan fixture, process.env-dəki konfiq) lazım olur.
DİQQƏT: JSON.parse yararsız mətndə xəta atır. Boş cavabı və ya HTML səhv səhifəsini parse etməyə çalışanda test anlaşılmaz Unexpected token < in JSON mesajı ilə düşür — bu, əslində serverin JSON yox, HTML qaytardığının əlamətidir.
| Giriş dəyəri | JSON.stringify-dan sonra | Nəticə |
|---|---|---|
| undefined sahə | sahə tamamilə itir | "sahə yoxdur" ilə "sahə boşdur" fərqi silinir |
| Date obyekti | ISO string | geri parse edəndə Date yox, string alırsan |
| funksiya / metod | itir | class instansiyası adi obyektə çevrilir |
| NaN, Infinity | null | hesablama səhvi gizlənir |
| Map, Set | boş obyekt {} | data səssizcə itir |
| dairəvi istinad | TypeError atılır | log-a obyekt yazarkən rast gəlinir |
Dərin datadan təhlükəsiz oxumaq. API cavabı iç-içə olanda hər səviyyəni yoxlamaq əvəzinə ?. və ?? istifadə et:
const city = body.items?.[0]?.shipping?.address?.city ?? 'unknown';
Bir sahə yoxdursa test Cannot read properties of undefined ilə deyil, aydın assertion mesajı ilə düşür.
Cavabın formasını yoxlamaq (contract testing). Dəqiq dəyərləri yox, strukturu və tipləri yoxla — belə test data dəyişəndə sınmır, müqavilə pozulanda isə düşür:
- massivdirmi:
Array.isArray(body.items) - tip:
typeof body.total === 'number' - açar mövcuddurmu:
'status' in order - Playwright/Jest matcher-ləri:
expect.objectContaining,expect.any(String),expect.arrayContaining
Dərin kopya üçün JSON.parse(JSON.stringify(obj)) köhnə tərzdir və yuxarıdakı bütün itkilərə səbəb olur. Müasir həll — structuredClone(obj): Date, Map, Set, iç-içə massivləri düzgün kopyalayır (funksiyaları isə yox — onlarda xəta atır).
İnterview üçün qısa cavab hazırla: "JSON round-trip dərin kopya deyil, sadələşdirmədir: undefined və funksiyalar itir, Date string olur, NaN null-a çevrilir. Ona görə test datasını `structuredClone` ilə və ya factory funksiya ilə kopyalayıram."
📚 Mənbələr və sənədlər
- JSONrəsmideveloper.mozilla.org