Source
QA Co-pilot | Код з душком: Перехресне запилення, або Чому ваші тести падають у CI/C...
29 Views/Reach
2026-05-15 06:03
Message №298
💩 Код з душком: Перехресне запилення, або Чому ваші тести падають у CI/CDПривіт, екіпаж! П'ятниця — час для генерального прибирання у ваших репозиторіях. Сьогодні ми препаруємо одну з найнебезпечніших інженерних хвороб — sharing state (обмін станом) між тестами. Це той випадок, коли ви використовуєте глобальні змінні для передачі даних від одного тесту до іншого. ☕️Знайдіть проблему в цьому коді:// ❌ Як пишуть джуни (Антипатерн "Глобальний наркоман")// Десь у глобальному скоупі файлуlet lastCreatedUserId: string;test('Тест 1: Створити юзера', async ({ request }) => { const newUser = await request.post('/api/users', { data: { name: 'Bro' } }); // Зберігаємо ID у глобальну змінну для наступного тесту lastCreatedUserId = (await newUser.json()).id;});test('Тест 2: Видалити створеного юзера', async ({ request }) => { // Використовуємо ID, який створив ПОПЕРЕДНІЙ тест await request.delete(`/api/users/${lastCreatedUserId}`);});
Чому цей код тхне:На вашій локальній машині це може працювати. Але в CI/CD Playwright за замовчуванням запускає тести паралельно (в різних воркерах/процесах).Коли воркер №2 почне виконувати «Тест 2», глобальна змінна lastCreatedUserId у його процесі буде порожньою (undefined), бо «Тест 1» виконувався в іншому воркері №1. У вас "червоний" пайплайн, а ви витрачаєте пів дня, намагаючись зрозуміти, чому тест на видалення не бачить ID.
✅ Як це виглядає після код-рев'ю Senior-інженера:// Ідеально чистий код (Повна атомарність)test('Повинен видаляти користувача', async ({ request }) => { // 1. Створюємо юзера ІЗОЛЬОВАНО всередині одного тесту const newUser = await request.post('/api/users', { data: { name: 'IsolatedBro' } }); const userId = (await newUser.json()).id; // 2. Використовуємо ID тут же await request.delete(`/api/users/${userId}`);});
Золоте правило: Кожен тест має бути повністю атомарним. Тест має сам створювати потрібні дані, виконувати дію і сам за собою прибирати (якщо це необхідно). Жодних глобальних змінних для передачі даних!А ваші тести бігають у паралель, чи ви боїтесь, що вони "перепиляться" даними? 👇🔥 — Тільки атомарні тести, тільки паралельний запуск!👀 — Грішимо глобальними змінними, тому запускаємо по одному...🤯 — Мої тести впали вчора, тепер я знаю чому!