Documentation
Documentation/Execution

Jobs Playwright

Comment ecrire des specs Playwright compatibles BernOps avec validations et rapports clairs.

playwrightjobstest.stepprocess.env
Voir le Markdown
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);
Ne loggez pas les secrets

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

SujetRecommandation
Valeurs runtimeLire avec process.env et valider au chargement du module ou au debut du test.
Valeurs navigateurTransmettre via fixtures, page.evaluate, headers de requete ou champs UI.
SecretsNe jamais afficher les valeurs secretes brutes.
DiagnosticsUtiliser test.step, des console.log concis, captures et messages d'assertion clairs.
URL de basePreferer les chemins relatifs page.goto() sauf si le test cible volontairement un autre host.