Introduzione a Playwright

Playwright è una libreria di testing end-to-end sviluppata da Microsoft con cui è possibile creare e automatizzare i test per garantire che le applicazioni Web funzionino nel modo previsto, in diversi Web browser e sistemi operativi.
Supporta diversi linguaggi di programmazione (Typescript, .NET, Java, …) e piattaforme (Windows, Linux, macOS) e può essere integrato nelle pipeline di CI/CD automatizzando il processo di testing.

Playwright, rispetto ad altri framework, ha alcuni vantaggi non trascurabili:

Velocità ed Affidabilità

  • Permette l’esecuzione di test in parallelo su più browser con una configurazione minimale.
  • Supporta la modalità headless (senza interfaccia grafica) per esecuzioni più rapide e fluide.

Supporto Multi-Browser

  • Compatibile con Chromium, Firefox, WebKit e offre funzionalità per il testing in ambiente mobile.

Automazione Avanzata

  • Simula interazioni complesse come drag-and-drop, gestione di file e manipolazione della rete.
  • Consente il testing delle API, estendendo il controllo oltre l’interfaccia utente.

Test Resilienti

  • Implementa un sistema di auto-retry, riducendo i fallimenti causati da caricamenti lenti.
  • Supporta condizioni di attesa avanzate, evitando l’uso di sleep() e migliorando la stabilità dei test.

Facilità di Debug

  • Registra screenshot e video dei test, semplificando l’analisi degli errori.
  • Include una modalità debug interattiva, che permette di fermare l’esecuzione e ispezionare lo stato dell’applicazione in tempo reale.

Integrazione con CI/CD

  • Compatibile con strumenti di continuous integration come GitHub Actions, Jenkins e GitLab CI, permettendo di automatizzare i test ad ogni rilascio.

In questo articolo utilizzeremo la libreria con Typescript per il testing di un’applicazione web, aiutandoci con il plugin apposito di PlayWright installabile dallo store di VS Code

 

Funzionalità dello strumento

Registrazione dei passi

È possibile iniziare a registrare un test e i suoi passi selezionando Testing > Record New, dove verrà avviata la registrazione delle azioni mentre si naviga nell’applicazione.

Figura 1: Sezione Testing VS Code

Figura 1: Sezione Testing VS Code

 

A questo punto, verrà avviato CodeGen di Playwright, supportato dal plugin per VS Code, per semplificare la creazione automatizzata dei test. Questo strumento offre diverse funzionalità, tra cui:

  • Un browser interattivo che registra automaticamente le azioni eseguite dall’utente.
  • Un file di test generato in VS Code, contenente le istruzioni corrispondenti alle azioni registrate.
  • Una barra degli strumenti integrata nel browser, utile per l’analisi degli elementi dell’applicazione web.

Tra le funzionalità più rilevanti della toolbar segnaliamo:

  • Pick-locator: permette di selezionare un elemento della pagina e generare in VS Code un’istruzione JavaScript per richiamarlo nei test.
  • Assert (visibility, text, value): consente di creare automaticamente in VS Code un’istruzione JavaScript per verificare proprietà specifiche di un elemento, come la visibilità, il testo o il valore.

 

Figura 2: Vista con CodeGen in esecuzione

Figura 2: Vista con CodeGen in esecuzione

Per terminare la registrazione e chiudere lo strumento CodeGen è possibile utilizzare il tasto di recording disponibile sulla barra degli strumenti

Figura 3: Barra degli strumenti e tasto recording

Figura 3: Barra degli strumenti e tasto recording

Esecuzione di un test

Per avviare l’esecuzione di un test, è possibile utilizzare:

  • L’interfaccia grafica fornita dal plugin di VS Code, che semplifica l’esecuzione e il debug dei test.
  • La CLI di Playwright, per un maggiore controllo e l’integrazione nei processi di automazione.

All’interno della sezione delle impostazioni di esecuzione, è possibile configurare parametri specifici per personalizzare il comportamento dei test, ottimizzando così l’ambiente di testing in base alle esigenze del progetto.

Figura 4: impostazioni di Playwright su VS Code

Figura 4: impostazioni di Playwright su VS Code

  • Projects: consente di selezionare i browser su cui eseguire i test.

  • Settings: permette di configurare l’esecuzione scegliendo tra diverse modalità:

      • Headed: visualizza il browser durante l’esecuzione, consentendo di osservare le azioni in tempo reale.
      • Trace Viewer: abilita uno strumento avanzato per analizzare in dettaglio le azioni eseguite.
      • Headless: esegue i test in modalità silenziosa, senza aprire il browser.

  • Tools: fornisce strumenti aggiuntivi per l’analisi e il debugging dei test.

      • Pick Locator: permette di identificare e selezionare un elemento nell’applicazione web, come visto nella fase di registrazione.
      • Record New: avvia la registrazione di un nuovo test.
      • Record at Cursor: registra le azioni nel file attivo, inserendole a partire dal cursore.
      • Reveal Test Output: apre la pagina contenente i risultati dell’ultima esecuzione dei test.

Quindi per effettuare le esecuzioni:

Figura 5: Test explorer di VS Code

Figura 5: Test explorer di VS Code

 

È possibile utilizzare la sezione Explorer di VS Code per eseguire i test, con la possibilità di attivare la modalità debug e impostare breakpoint. Questo consente di eseguire il codice passo dopo passo, monitorando l’esecuzione e analizzando le variabili in tempo reale.

Figura 6: tasti di esecuzione sul test

Figura 6: tasti di esecuzione sul test

Cliccando con il tasto destro sui tasti, vengono visualizzate opzioni aggiuntive, come la possibilità di avviare la modalità debug.

Figura 7: esempio di esecuzione in VS Code

Figura 7: esempio di esecuzione in VS Code

 

 


Automazione del testing con Gitlab CI/CD

I test possono essere integrati all’interno della repository di una web app. In combinazione con il deploy su un ambiente designato, è possibile creare un job che esegua automaticamente i test disponibili sull’endpoint.

  # Variables  
  variables:  
    BASE_URL: $BASE_URL # variable defined in GitLab Project CI/CD Settings  
  # Define the stages for your pipeline  
  stages:  
    - test  
  
  # Define the job for running Playwright tests  
  run_playwright_tests:  
    stage: test  
    image: mcr.microsoft.com/playwright:v1.39.0-jammy  

    script:  
      - npm ci # Install project dependencies  
      - npx playwright test # Run your Playwright tests   
      - echo "https://$CI_PROJECT_NAMESPACE.gitlab.io/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/playwright-report/index.html" # print the URL to view the results  

    allow_failure: true   

# Publish Playwright test results as artifacts and keep for 2 days  

  artifacts:  
    when: always  
    paths:  
      - playwright-report  
    expire_in: 2 days

 


Reporting custom dei risultati con la funzionalità Reporter

Playwright offre la possibilità di implementare un Reporter personalizzato, diverso da quello di default, per la gestione avanzata dei risultati degli step del test. Il Reporter è un componente della libreria che riceve tutti i dati relativi all’esecuzione del test, consentendo un’analisi e un reporting su misura.

  import { FullConfig, FullResult, Reporter, Suite, TestCase, TestError, TestResult, TestStep } from "playwright/types/testReporter";

  class TestResultReporter implements Reporter {
    onBegin(config: FullConfig, suite: Suite): void {
    }
    onEnd(result: FullResult): Promise<{ status?: FullResult["status"]; } | undefined | void> | void {
    }
    onError(error: TestError): void {
    }
    onExit(): Promise<void> {
      return new Promise(() => {});
    }
    onStdErr(chunk: string | Buffer, test: void | TestCase, result: void | TestResult): void {
    }
    onStdOut(chunk: string | Buffer, test: void | TestCase, result: void | TestResult): void {
    }
    onStepBegin(test: TestCase, result: TestResult, step: TestStep): void {
    }
    onStepEnd(test: TestCase, result: TestResult, step: TestStep): void {
    }
    onTestBegin(test: TestCase, result: TestResult): void {
    }
    onTestEnd(test: TestCase, result: TestResult): void {
    }

    printsToStdio(): boolean {
      return true;
    }
  }

Il Reporter può poi essere utilizzato specificandolo nel file di configurazione playwright.config.ts, dove è possibile configurare il tipo di reporting desiderato e integrarlo con altre funzionalità personalizzate.

import { defineConfig } from '@playwright/test';
export default defineConfig(
{  
   reporter: './my-awesome-reporter.ts',
 }
);

Ad esempio, all’interno delle diverse callback, è possibile inviare i risultati direttamente a un database tramite query, consentendo una gestione centralizzata e una facile consultazione dei dati di test.

  onTestEnd(test: TestCase, result: TestResult): void {
    const connection = await mysql.createConnection(dbConfig);  // Crea una connessione al database
      const testCaseResult = await connection.execute(
  `INSERT INTO test_cases (test_case_id, test_description, test_results, browser_name, execution_time, execution_error, execution_date, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,

      [
          test.id || null,
          test.title || null,
          test.results,
          test.browserName || null,
          result.duration,
          result.error || null,
          new Date(),
          new Date(),
          new Date()
        ]
      );
    ...
  }


Conclusione

Lo strumento è stato impiegato con successo in diversi casi d’uso di testing, tra cui:

  • Garantire la non regressione delle funzionalità esistenti durante l’introduzione di nuove caratteristiche.
  • Eseguire test di affidabilità nel tempo tramite l’utilizzo di test ciclici.
  • Supportare lo sviluppo di nuove funzionalità seguendo un approccio test-driven.

Questi utilizzi ci hanno permesso di migliorare l’affidabilità dei test, ridurre i tempi di verifica e simulare scenari reali d’uso in modo efficace. Lo strumento si è rivelato particolarmente utile per garantire la qualità delle applicazioni web complesse, caratterizzate da interazioni utente articolate.