Testlərin Docker-də icrası
Docker avtotestlər üçün bir problemi həll edir: "məndə işləyir". Brauzer versiyası, sistem kitabxanaları, şriftlər, locale, timezone — bunların hamısı image-də sabitlənir, yəni lokal maşın, hər komanda üzvü və CI eyni mühitdə işləyir.
Rəsmi image: mcr.microsoft.com/playwright:v1.49.0-noble — içində brauzerlər (Chromium, Firefox, WebKit) və bütün sistem asılılıqları hazır gəlir. Bu, npx playwright install --with-deps addımını və onunla gələn 2-3 dəqiqəni aradan qaldırır.
Ən vacib qayda: image teqi package.json-dakı @playwright/test versiyası ilə eyni olmalıdır. Uyğunsuzluq olduqda ya "Executable doesn't exist" xətası alırsan, ya da daha pisi — testlər gözlənilməz davranır. Bu, mövzunun bir nömrəli tələsidir və dependency yeniləməsi zamanı hər dəfə yada salınmalıdır.
Nə vaxt Docker istifadə edirəm:
- CI-da — mühitin sabitliyi və sürətli start üçün
- Vizual test baseline-larını yaratmaq üçün — CI ilə eyni şrift rendering-i vacibdir
- "Lokalda keçir, CI-da sınır" araşdırmasında — CI şəraitini lokalda təkrarlamaq
- Tam stack-i qaldırmaq üçün (app + DB + testlər) — docker compose ilə
docker compose ilə tam mühit — testlər, tətbiq və verilənlər bazası bir yerdə qalxır. Bu, xüsusilə dəyərlidir, çünki hər PR üçün təmiz, təcrid olunmuş mühit yaradır: paylaşılan stage mühitinin "kimsə datanı dəyişdi" problemi yox olur.
Burada bir neçə klassik tələ var və interview-da məhz bunlar soruşulur:
- `localhost` işləmir. Container-in öz şəbəkə namespace-i var;
http://localhost:3000container-in özünə işarə edir. Doğru ünvan servis adıdır:http://app:3000. - `/dev/shm` çatışmazlığı. Docker default olaraq 64MB paylaşılan yaddaş verir; Chromium bunu tez tükədir və
Target closedvə yaBrowser crashedkimi anlaşılmaz xətalarla çökür. Həll:--shm-size=1gb(və ya--ipc=host). Bu, CI-da flaky-nin çox rast gəlinən, amma nadir tanınan səbəbidir. - Servisin hazır olmaması. Container qalxması ≠ tətbiqin cavab verməsi.
depends_ontək başına kifayət deyil —healthcheck+condition: service_healthylazımdır, əks halda testlər tətbiq hələ yüklənərkən başlayır. - Fayl sahibliyi (Linux-da). Container root kimi işləsə, yaradılan artefaktlar (
playwright-report/,test-results/) root-a məxsus olur və host-da silinmir. Həll:-u $(id -u):$(id -g). - Volume mount və `node_modules`. Host-un
node_modules-unu container-ə mount etmək platformaya bağlı binary-lər səbəbindən sınır — ya image daxilindənpm ciet, yanode_modules-u anonim volume ilə istisna et. - Layer caching.
COPY package*.json→RUN npm ci→COPY . .ardıcıllığı vacibdir; əks halda hər kod dəyişikliyində bütün asılılıqlar yenidən quraşdırılır.
| Simptom | Səbəb | Həll |
|---|---|---|
| "Executable doesn't exist" | Image teqi @playwright/test versiyası ilə uyğun deyil | Teqi package.json versiyası ilə eyniləşdir |
| Chromium təsadüfi çökür, "Target closed" | /dev/shm 64MB default ilə dolur | --shm-size=1gb və ya --ipc=host |
| ECONNREFUSED localhost:3000 | Container öz namespace-inə baxır | BASE_URL-də servis adı: http://app:3000 |
| İlk testlər sınır, sonrakılar keçir | Tətbiq hələ tam qalxmayıb | healthcheck + condition: service_healthy |
| Artefaktları host-da silmək mümkün deyil | Container root kimi işləyib | -u $(id -u):$(id -g) |
| Hər build-də npm ci yenidən işləyir | COPY . . asılılıq quraşdırmasından ƏVVƏLDİR | Əvvəl package*.json kopyala, sonra npm ci, sonra qalan kod |
İnterview-da güclü konkret detal: `--shm-size=1gb`. "Docker-də Chromium təsadüfi çökürdü; səbəb default 64MB /dev/shm idi" cümləsi real təcrübənin ən inandırıcı göstəricilərindəndir — bu problemi yalnız onu yaşayan bilir. Eyni şəkildə localhost yerinə servis adı və image versiyasının uyğunluğu da "kitabdan oxumuş" ilə "qurmuş" arasındakı fərqi göstərir.
📚 Mənbələr və sənədlər
- Dockerrəsmiplaywright.dev