Debugging texnikaları
Debugging təsadüfi console.log səpmək deyil — axtarış sahəsini ardıcıl daraltmaqdır. Test düşəndə suallara bu sırada cavab ver:
1. Nə düşdü? Assertion, yoxsa kodun özü? Assertion xətası "məhsul gözləniləndən fərqlidir" deməkdir; TypeError/undefined isə test kodunun öz problemidir.
2. Harada düşdü? Stack trace-in SƏNİN kodundakı ən yuxarı sətri — framework sətirlərini keç.
3. Hansı data ilə? O anda dəyişənlərin real dəyəri nədir — çap et və ya breakpoint qoy.
4. Həmişəmi düşür? Təkrar işlət (--repeat-each). Hər dəfə düşürsə real bug; bəzən düşürsə flakiness (vaxt, sıra, paylaşılan state).
5. Hər yerdəmi düşür? Lokalda keçib CI-da düşürsə fərq mühitdədir: timezone, locale, ekran ölçüsü, sürət, data.
Bu ardıcıllığı interview-də səsləndirmək özlüyündə güclü cavabdır — namizədin sistemli düşündüyünü göstərir.
| Alət | Nə üçün | Qeyd |
|---|---|---|
| console.log | sadə dəyər və ya axının yoxlanması | obyekt massivlərində oxunmaz olur |
| console.table(arr, ['id','status']) | obyekt massivini cədvəl kimi göstərir | API cavablarını yoxlamaq üçün ideal |
| console.dir(obj, { depth: null }) | iç-içə strukturu tam açır | Node adi log-da dərinliyi kəsir |
| console.time / timeEnd | addımın nə qədər çəkdiyini ölçür | yavaş testin səbəbini tapmaq üçün |
| breakpoint (VS Code) | icranı dayandırıb bütün dəyişənləri görmək | log-dan qat-qat sürətlidir |
| Playwright trace viewer | hər addımın DOM, şəbəkə və konsolu | CI-dakı fail üçün əsas alət |
Breakpoint-lər və debugger-lər. VS Code-da sətir nömrəsinin solunda klikləyib breakpoint qoyursan, sonra testi debug rejimində işlədirsən — icra həmin sətirdə dayanır və bütün dəyişənlərin real dəyərini, çağırış stack-ini, hətta konsolda ifadə hesablamağı görürsən.
Faydalı növlər:
- Conditional breakpoint — yalnız şərt ödənəndə dayanır (
orderId === '1042'); 500 elementli dövrədə əvəzsizdir - Logpoint — dayanmadan mesaj yazır; kodu dəyişmədən "console.log" effekti verir
- Caught/uncaught exception breakpoint-i — xəta atılan anda dayanır
Node üçün ümumi mexanizm: node --inspect-brk script.js prosesi başlanğıcda dayandırır və debugger-in qoşulmasını gözləyir; sonra chrome://inspect və ya VS Code-un "Attach to Node Process" əmri ilə qoşulursan. Playwright-ın öz qısa yolu isə npx playwright test --debug (Inspector) və koddakı await page.pause()-dur.
Stack trace-i oxumaq — ən çox qazandıran bacarıqlardan biridir və interview-də tez-tez yoxlanılır. Qayda: birinci sətir xətanın TİPİ və mesajıdır; sonrakı sətirlər isə çağırış zənciridir — yuxarıdan aşağı: harada partladı → onu kim çağırdı. node_modules sətirlərini keç, gözünü SƏNİN faylların olan ilk sətrə sal — problem demək olar həmişə oradadır.
Asinxron kodda stack trace qısa və faydasız görünə bilər (at processTicksAndRejections), çünki xəta orijinal çağırışdan ayrı bir tick-də baş verir. Bunun ən çox rast gəlinən səbəbi unudulmuş await-dir: await əlavə etmək həm bug-ı düzəldir, həm də stack trace-i oxunaqlı edir. new Error(msg, { cause: originalError }) ilə xətanı zənginləşdirmək də konteksti saxlayır.
📚 Mənbələr və sənədlər
- Chrome DevTools: JavaScript debuggingrəsmideveloper.chrome.com
- Node.js debuggingrəsminodejs.org