Jobs Playwright
Comment ecrire des specs Playwright compatibles BernOps avec validations et rapports clairs.
Sur cette page
BernOps execute des fichiers de test Playwright. Un job enregistre reste un spec Playwright normal ; BernOps le stocke, le dispatch vers un worker, injecte les valeurs runtime du projet et enregistre la telemetrie.
Forme requise
Au minimum, un script importe test depuis @playwright/test et declare un ou plusieurs tests.
import { test, expect } from '@playwright/test';
test('verifie la page de connexion', async ({ page }) => {
await page.goto('/sign-in');
await expect(page.getByRole('heading', { name: /welcome/i })).toBeVisible();
});La configuration Playwright generee definit use.baseURL avec l'URL de base resolue par BernOps. page.goto('/sign-in') est donc resolu contre l'URL de base de l'execution, une variable runtime BASE_URL ou TARGET_URL, ou http://localhost:3000.
Valider les valeurs runtime explicitement
Si un script depend d'une valeur runtime, echouez tot avec un message clair.
function requiredEnv(name: string) {
const value = process.env[name]?.trim();
if (!value) throw new Error(`Missing required runtime variable: ${name}`);
return value;
}
const API_KEY = requiredEnv('HAPPY_PATH_QUEUE_API_KEY');C'est mieux que laisser une requete echouer plus tard avec une erreur d'autorisation qui masque la vraie cause.
Processus Node versus page navigateur
Les tests Playwright s'executent dans Node. process.env existe dans le processus de test, pas dans la page navigateur. Si un script navigateur a besoin d'une valeur, transmettez-la volontairement.
const token = requiredEnv('TEST_SESSION_TOKEN');
await page.evaluate((value) => {
window.localStorage.setItem('session_token', value);
}, token);Le worker masque les valeurs secretes connues dans les logs et resultats, mais les jobs doivent quand meme eviter d'afficher tokens, mots de passe, cles API, cookies ou headers.
Utiliser test.step pour des rapports lisibles
BernOps enregistre les etapes Playwright et stdout. Des etapes structurees rendent les pages de detail beaucoup plus lisibles.
Pour generer logs, etapes imbriquees, metriques, progression et pieces jointes durables sans cle API, consultez le guide natif du SDK d'automatisation.
test('cree un element de file', async () => {
await test.step('resoudre backend et file', async () => {
// Recuperer les ressources projet et valider les hypotheses.
});
await test.step('ajouter element', async () => {
// Appeler l'API de file.
});
});Appels de service depuis les jobs
Les jobs peuvent appeler des APIs directement avec fetch. C'est utile pour setup, teardown, files et assertions plus simples hors navigateur.
async function api<T>(baseUrl: string, token: string, path: string) {
const response = await fetch(`${baseUrl}${path}`, {
headers: { authorization: `Bearer ${token}` },
});
if (!response.ok) {
throw new Error(`GET ${path} failed with ${response.status}: ${await response.text()}`);
}
return (await response.json()) as T;
}Timeouts et flux longs
Le timeout genere par defaut est de 30 secondes. Les demos longues ou les boucles de polling doivent definir un timeout explicite dans le test.
test('remplit lentement une file', async () => {
test.setTimeout(180_000);
// Flux long.
});Checklist d'ecriture
| Sujet | Recommandation |
|---|---|
| Valeurs runtime | Lire avec process.env et valider au chargement du module ou au debut du test. |
| Valeurs navigateur | Transmettre via fixtures, page.evaluate, headers de requete ou champs UI. |
| Secrets | Ne jamais afficher les valeurs secretes brutes. |
| Diagnostics | Utiliser test.step, des console.log concis, captures et messages d'assertion clairs. |
| URL de base | Preferer les chemins relatifs page.goto() sauf si le test cible volontairement un autre host. |