🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Testing Automatizzato in CI: Migliorare la Qualità del Software con Continuous Integration

Codegrind TeamAug 28 2024

Il testing automatizzato è un elemento chiave nel garantire la qualità del software, e l’integrazione continua (Continuous Integration, CI) è il processo che permette di eseguire questi test automaticamente ogni volta che viene effettuato un commit nel repository. Implementare il testing automatizzato in un ambiente CI aiuta a identificare rapidamente bug e regressioni, migliorando la stabilità del progetto. In questa guida, esploreremo come configurare una pipeline CI per eseguire test automatizzati utilizzando strumenti popolari come GitHub Actions, Jenkins, e GitLab CI.

Perché il Testing Automatizzato è Importante in CI?

Il testing automatizzato in CI offre diversi vantaggi chiave:

  • Rilevazione Rapida dei Bug: Esegui test su ogni commit per identificare subito eventuali problemi.
  • Regressioni Evitate: Garantisci che le nuove modifiche non rompano funzionalità esistenti.
  • Efficienza: Automatizza l’intero processo di testing, riducendo il lavoro manuale e il rischio di errori.
  • Qualità Costante: Mantieni una qualità del software elevata e costante lungo l’intero ciclo di sviluppo.

Strumenti Popolari per il Testing Automatizzato in CI

1. GitHub Actions

GitHub Actions è una piattaforma CI/CD integrata in GitHub che permette di automatizzare flussi di lavoro, inclusi i test.

2. Jenkins

Jenkins è un server di automazione open source, molto popolare per CI/CD, che supporta l’esecuzione di test automatizzati tramite pipeline configurabili.

3. GitLab CI

GitLab CI è una soluzione integrata in GitLab che permette di eseguire pipeline CI/CD direttamente nei progetti ospitati su GitLab.

Configurare una Pipeline CI per il Testing Automatizzato

Esempio 1: Testing Automatizzato con GitHub Actions

Per configurare una pipeline CI in GitHub Actions che esegue test automatizzati:

  1. Crea un File di Configurazione per GitHub Actions: Inizia creando una cartella .github/workflows nel tuo repository, e all’interno, un file YAML, ad esempio ci.yml:

    name: CI Pipeline
    
    on: [push, pull_request]
    
    jobs:
      test:
        runs-on: ubuntu-latest
    
        steps:
          - name: Checkout repository
            uses: actions/checkout@v2
    
          - name: Setup Node.js
            uses: actions/setup-node@v2
            with:
              node-version: "16"
    
          - name: Install dependencies
            run: npm install
    
          - name: Run tests
            run: npm test
    
  2. Esegui il Workflow: Ogni volta che viene effettuato un push o una pull request, GitHub Actions eseguirà i test definiti nello script npm test.

Esempio 2: Testing Automatizzato con Jenkins

Per configurare una pipeline CI in Jenkins:

  1. Crea un Nuovo Job:

    • Accedi alla tua dashboard di Jenkins.
    • Clicca su “New Item” e crea un nuovo job Pipeline.
  2. Configura la Pipeline:

    • Nella sezione “Pipeline”, scegli di definire la pipeline con un file Jenkinsfile o con lo script direttamente nella UI.

    Esempio di Jenkinsfile:

    pipeline {
        agent any
    
        stages {
            stage('Checkout') {
                steps {
                    git 'https://github.com/username/repository.git'
                }
            }
            stage('Install Dependencies') {
                steps {
                    sh 'npm install'
                }
            }
            stage('Run Tests') {
                steps {
                    sh 'npm test'
                }
            }
        }
    }
    
  3. Salva e Esegui il Job:

    • Dopo aver configurato la pipeline, salva il job. Jenkins eseguirà la pipeline, includendo i test, ogni volta che viene attivata (ad esempio, tramite un trigger di commit).

Esempio 3: Testing Automatizzato con GitLab CI

Per configurare una pipeline CI in GitLab CI:

  1. Crea un File .gitlab-ci.yml nel Tuo Repository: GitLab CI utilizza un file di configurazione .gitlab-ci.yml per definire le pipeline:

    stages:
      - test
    
    test:
      stage: test
      script:
        - npm install
        - npm test
      only:
        - main
        - develop
    
  2. Pipeline Automatica: GitLab eseguirà la pipeline ogni volta che viene effettuato un commit nei branch main o develop.

Scrivere Test Automatizzati

Test Unitari

I test unitari verificano la correttezza di singole funzioni o moduli. Puoi utilizzare strumenti come Jest, Mocha, o Jasmine per scrivere test unitari in JavaScript/Node.js.

Esempio di test con Jest:

const sum = require("./sum");

test("adds 1 + 2 to equal 3", () => {
  expect(sum(1, 2)).toBe(3);
});

Test di Integrazione

I test di integrazione verificano l’interazione tra diverse parti del sistema. Possono coinvolgere componenti come database, API esterne, e altri servizi.

Esempio di test di integrazione:

const request = require("supertest");
const app = require("./app");

describe("GET /users", () => {
  it("responds with json containing a list of all users", (done) => {
    request(app)
      .get("/users")
      .set("Accept", "application/json")
      .expect("Content-Type", /json/)
      .expect(200, done);
  });
});

Includere Test Automatizzati in una Pipeline CI

Gestione delle Dipendenze

Assicurati che tutte le dipendenze necessarie per eseguire i test siano installate correttamente nella pipeline. Questo include installare i moduli Node.js, configurare variabili d’ambiente, e, se necessario, avviare servizi come database.

Configurare Reporting dei Test

Imposta il reporting dei test nella pipeline CI per visualizzare i risultati in modo chiaro. Molti strumenti di CI supportano il reporting di test in formato JUnit o altre convenzioni standard.

Esempio di reporting in Jest:

- name: Run tests
  run: jest --ci --reporters=jest-junit

Integrazione con Altri Servizi

Integrazioni con servizi come Slack, email, o dashboard CI possono notificare il team in caso di fallimento dei test, facilitando la collaborazione e la risoluzione dei problemi.

Best Practices per il Testing Automatizzato in CI

  • Test Frequenti: Esegui test su ogni commit per identificare subito eventuali problemi.
  • Test Isolati: I test dovrebbero essere isolati e indipendenti l’uno dall’altro per evitare comportamenti inconsistenti.
  • Parallelizzazione: Se possibile, esegui i test in parallelo per ridurre il tempo complessivo di esecuzione.
  • Reporting Chiaro: Configura report chiari e dettagliati per facilitare l’analisi dei fallimenti.
  • Ambiente Consistente: Usa container o macchine virtuali per garantire che i test vengano eseguiti in un ambiente coerente con quello di produzione.

Risolvere Problemi Comuni

Test che Falliscono in CI ma Non in Locale

Questo può essere causato da differenze nell’ambiente di esecuzione tra locale e CI. Verifica le versioni delle dipendenze, l’accesso alle risorse, e la configurazione dell’ambiente.

Tempi di Esecuzione Elevati

Se i test richiedono troppo tempo per essere eseguiti, valuta la possibilità di parallelizzarli o di ridurre la quantità di test eseguiti su ogni commit (ad esempio, eseguire solo test rapidi su commit e test completi su build notturne).

Conclusione

Il testing automatizzato in un ambiente CI è una componente fondamentale per garantire la qualità del software. Integrando test unitari, di integrazione e di altro tipo nelle tue pipeline CI, puoi rilevare rapidamente bug e garantire che il tuo software rimanga stabile e funzionale. Utilizzando strumenti come GitHub Actions, Jenkins, o GitLab CI, è possibile configurare pipeline efficienti che automatizzano l’intero processo di testing, consentendoti di concentrarti sulla scrittura di codice di alta qualità.