Sürətli texniki suallar (rapid-fire)
Bir çox interview "rapid-fire" mərhələsi ilə başlayır: 10-15 qısa sual, ardıcıl, hər birinə 20-40 saniyə. Məqsəd dərin bilik yoxlamaq deyil — əsasların oturuşub-oturuşmadığını və sənin özünü rahat hiss edib-etmədiyini görməkdir.
Necə cavab vermək lazımdır:
- Qısa və birbaşa — 2-3 cümlə. Uzun cavab burada mənfi siqnaldır: sualın sadə olduğunu görmədiyini göstərir
- Sonra dərinlik təklif et: "...istəsəniz, detallara girə bilərəm" — intervyuer maraqlanırsa, özü soruşacaq
- Nümunə əlavə et (bir cümlə ilə) — konkret nümunə cavabı əzbərdən fərqləndirir
- Bilmirsənsə — "Bunu dəqiq bilmirəm, amma güman edirəm ki..." və ya sadəcə "Bilmirəm, öyrənərəm." Uydurmaq ən pis variantdır: intervyuer bunu demək olar ki, həmişə hiss edir və ondan sonra bütün cavablarına şübhə ilə yanaşır
Ritm məsələsi: 15 sualdan 2-3-nə "bilmirəm" demək tamamilə normaldır. 15-in 15-nə cavab vermək gözlənilmir; təmkinli və dürüst davranmaq gözlənilir.
| Sual | Model cavab (20-30 saniyə) |
|---|---|
| Playwright-da auto-waiting nədir? | Hər action-dan əvvəl Playwright elementin actionable olmasını gözləyir: görünür, aktiv, stabil, hadisə qəbul edir. Ona görə `sleep` yazmağa ehtiyac yoxdur. |
| `locator` ilə `ElementHandle` fərqi? | Locator lazy-dir — hər istifadədə elementi yenidən tapır, ona görə DOM yenilənəndə sınmır. ElementHandle konkret DOM elementinə bağlanır və köhnəlir (stale olur); müasir kodda istifadə olunmur. |
| `toBeVisible()` ilə `isVisible()` fərqi? | `expect(...).toBeVisible()` web-first assertion-dır — şərt ödənənə qədər gözləyir. `isVisible()` isə həmin anın boolean cavabını qaytarır, gözləmir — testdə şərt kimi istifadə etmək flakiness mənbəyidir. |
| Strict mode nədir? | Locator birdən çox elementə uyğun gələndə Playwright xəta atır — səssiz səhv seçimin qarşısını alır. Həlli: locator-u dəqiqləşdirmək, `filter()`, və ya niyyət varsa `first()`/`nth()`. |
| `page` və `context` fərqi? | `context` izolyasiya olunmuş brauzer profilidir — öz cookie-ləri və storage-ı var; `page` onun içindəki bir tab-dır. İki fərqli istifadəçi üçün iki context lazımdır, iki tab yox. |
| storageState nə üçündür? | Login-i bir dəfə setup-da edib cookie/localStorage-ı fayla yazır; bütün testlər həmin state ilə başlayır. Hər testdə 5-10 saniyə qənaət edir. |
| Fixture teardown harada yazılır? | `await use(...)` sətrindən sonrakı kodda. Test fail olsa belə icra olunur — buna görə cleanup üçün ən etibarlı yerdir. |
| Sharding nədir? | Suite-i bir neçə maşına bölmək: `--shard=1/4`. 4 maşın ümumi müddəti təxminən 4 dəfə azaldır. Şərt: testlər tam müstəqil olmalıdır. |
| iframe içindəki elementə necə çatırsan? | `page.frameLocator('iframe[title="..."]')` ilə frame kontekstinə keçirəm; içəridə adi locator-lar işləyir. Adi locator frame sərhədini keçmir. |
| Yeni tab açılırsa nə edirsən? | Klikdən ƏVVƏL `context.waitForEvent('page')` ilə gözləməni qururam, sonra klik edirəm və `await` ilə yeni `page` obyektini alıram. |
| Fayl yükləməsini necə test edirsən? | `setInputFiles('path/to/file')` — OS dialoqu açılmır. Gizli input-lu custom düymə varsa, `page.waitForEvent('filechooser')` ilə tuturam. |
| API-ni Playwright-da necə çağırırsan? | `request` fixture-i ilə: `await request.post('/api/orders', { data })`. Test datasını hazırlamaq üçün UI əvəzinə bunu istifadə edirəm — sürətli və stabildir. |
| Sual | Model cavab |
|---|---|
| `==` ilə `===` fərqi? | `===` tip çevirməsi etmir; `==` edir (`'1' == 1` → true). Testlərdə həmişə `===`. |
| Promise nədir, `async/await` nə edir? | Promise gələcəkdə tamamlanacaq əməliyyatın nəticəsidir. `await` onun həllini gözləyir və kodu ardıcıl oxunan formada saxlayır. Playwright API-si bütünlüklə async-dır — `await` unutmaq testi səssizcə yalan yaşıl edir. |
| `let`, `const`, `var` fərqi? | `const` və `let` block scope-ludur; `var` function scope-lu və hoisting-lidir — istifadə etmirəm. Default `const`, dəyər dəyişəcəksə `let`. |
| TypeScript-in test kodunda faydası nədir? | Səhvlərin işə salmadan tapılması, IDE avtotamamlaması (Playwright API-si üçün böyük fərq), fixture və test datası üçün tiplər. Həm də `no-floating-promises` kimi typed lint qaydalarını mümkün edir. |
| Flaky test nədir? | Kod dəyişmədən gah keçən, gah sınan test. Tipik səbəblər: yarış vəziyyətləri, sabit sleep-lər, paylaşılan data. Ən böyük zərəri suite-ə inamı öldürməsidir. |
| Smoke ilə regression fərqi? | Smoke — ən kritik axınların sürətli yoxlanması (build ümumiyyətlə işləkdirmi?), hər PR-da. Regression — geniş əhatə, mövcud funksionallığın sınmadığını təsdiqləyir, adətən nightly. |
| Test piramidası nədir? | Çoxlu sürətli unit, orta qədər integration/API, az sayda E2E UI. Prinsip: yoxlamanı mümkün olan ən aşağı səviyyədə et. |
| Git-də `merge` ilə `rebase` fərqi? | `merge` tarixçəni saxlayır və birləşdirmə commit-i yaradır; `rebase` commit-ləri yenidən yazaraq xətti tarixçə verir. Paylaşılan branch-ı rebase etmək təhlükəlidir. |
Ən vacib məsləhət: uydurma. "Bilmirəm" cavabı bir sualı itirir; uydurulmuş cavab isə bütün müsahibəyə şübhə salır, çünki intervyuer artıq hər cavabını yoxlamağa başlayır. Ən güclü variant: "Bunu istifadə etməmişəm, amma prinsipi belə təsəvvür edirəm... — düzdürmü?" Bu, həm dürüstlük, həm düşünmə qabiliyyəti, həm də öyrənməyə açıqlıq göstərir.