Sparround

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:3000 container-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 closed və ya Browser crashed kimi 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_on tək başına kifayət deyil — healthcheck + condition: service_healthy lazı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 ci et, ya node_modules-u anonim volume ilə istisna et.
  • Layer caching. COPY package*.jsonRUN npm ciCOPY . . 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.
SimptomSəbəbHəll
"Executable doesn't exist"Image teqi @playwright/test versiyası ilə uyğun deyilTeqi 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:3000Container öz namespace-inə baxırBASE_URL-də servis adı: http://app:3000
İlk testlər sınır, sonrakılar keçirTətbiq hələ tam qalxmayıbhealthcheck + condition: service_healthy
Artefaktları host-da silmək mümkün deyilContainer root kimi işləyib-u $(id -u):$(id -g)
Hər build-də npm ci yenidən işləyirCOPY . . 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