Logo Light
Published on

Playwright - nečekaná změna hodnoty proměnné nastavené v beforeAll

Problém?

V předchozím článku jsme si vysvětlili, že pokud chceme ve více testech používat stejná testovací data (např. unikátní e-mail), je potřeba je vygenerovat jen jednou v beforeAll:

let validUser

test.describe('Authentication API', () => {
  test.beforeAll(() => {
    validUser = {
      email: `testuser_${Date.now()}@example.com`,
      password: 'MyPassword',
    }
  })

  test('registrace nového uživatele', async () => {
    console.log(validUser.email) // vypíše něco jako testuser_1753241517705@example.com
  })

  test('registrace duplicitního uživatele', async () => {
    console.log(validUser.email) // mělo by být stejné jako výše
  })
})

Pokud spustíme celou sadu testů, beforeAll se zavolá jen jednou a vše funguje správně.

Jenže při ladění testů se nám může stát, že dvěma testům nastavíme test.only a v druhém testu pak dostaneme jiný e‑mail, a test proto selže.

Proč se to děje?

Pro každý test označený test.only (popř. odpovídající podmínce v --grep) spustí Playwright samostatně jen vybraný test. Playwright při tom:

  • znovu načte celý soubor s testy
  • spustí znovu i beforeAll
  • a tím pádem vygeneruje nový e-mail s novým Date.now()

Jak to vyřešit?

Buď v těchto případech musíme pustit celou describe skupinu (beforeAll se zavolá jen jednou a data budou konzistentní) a nebo ladíme jen jeden test, můžete si e-mail dočasně „fixnout“:

validUser = {
  email: 'testuser_fixed@example.com',
  password: 'MyPassword',
}

Shrnutí

  • beforeAll funguje správně, pokud spouštíte více testů najednou.
  • test.only spustí Playwright izolovaně, takže beforeAll se vykoná znovu a vygeneruje nové hodnoty.
  • Pro ladění si buď fixněte data, nebo spusťte celou sadu.
  • Stejně jako v předchozím článku lze ale těmto problémům předejít, pokud budeme psát testy, které jsou na sobě nezávislé. Alespoň jsme na tomto příkladu ilustrovali, jak se chová beforeAll v kombinaci s test.only :)