# Test e debug (/it/docs/verdent-for-vscode/task-based-guides/testing-debugging)

> Flussi di lavoro di test e debug con Verdent



Verdent for VS Code ti aiuta a scrivere test completi e a eseguire il debug dei problemi attraverso cicli multipass di generazione-test-riparazione, analisi degli errori e miglioramenti automatici della copertura dei test. Genera test unitari, di integrazione ed end-to-end che rispecchiano il framework di test e lo stile del tuo progetto.

### Cosa imparerai [#cosa-imparerai]

* Generare test unitari che coprono casi limite e comportamenti attesi
* Lavorare con tutti i principali framework di test (Jest, Pytest, JUnit, ecc.)
* Creare test di integrazione che verificano flussi di lavoro con più componenti
* Migliorare la copertura dei test individuando e testando i percorsi di codice non coperti
* Eseguire il debug dei problemi usando l'analisi dei messaggi di errore e il tracciamento dell'esecuzione
* Diagnosticare i bug a partire da stack trace, log degli errori e comportamenti inattesi

### Prerequisiti [#prerequisiti]

Prima di eseguire test e debug con Verdent:

* Visual Studio Code con l'estensione Verdent installata
* Un codebase o un workspace di progetto aperto in VS Code
* Un abbonamento Verdent attivo con crediti disponibili
* Un framework di test configurato nel tuo progetto (facoltativo per la generazione di test)

***

## Scrivere test unitari [#scrivere-test-unitari]

Verdent genera test unitari che rispecchiano il framework di test e lo stile del tuo progetto. Analizza i test esistenti per comprendere i tuoi pattern, quindi genera test con setup, asserzioni e mocking appropriati.

**Esempio:**

```
Write unit tests for the calculateDiscount function
```

Verdent farà quanto segue:

* Esaminerà l'implementazione della funzione `calculateDiscount`
* Identificherà i parametri di input e i valori di ritorno
* Analizzerà i test esistenti per rispecchiare le tue convenzioni (struttura dei test, stile delle asserzioni, pattern di denominazione)
* Genererà test che coprono:
  * **Percorso principale**: input validi con output attesi
  * **Casi limite**: valori di confine, zero, numeri negativi, valori massimi
  * **Input non validi**: null, undefined, tipi errati
  * **Comportamento atteso**: validazione della logica di business

**Struttura dei test generati:**

Verdent crea test seguendo i pattern del tuo progetto:

* **Organizzazione della suite di test**: blocchi describe, classi di test o struttura a moduli
* **Setup e teardown**: hook before/after che rispecchiano i tuoi test esistenti
* **Asserzioni**: usando la libreria di asserzioni del tuo progetto (expect, assert, should, ecc.)
* **Mocking**: rispecchiando i tuoi pattern di mocking (jest.mock, sinon, unittest.mock)
* **Convenzioni di denominazione**: nomi dei test che seguono lo stile che hai stabilito

**Cicli multipass di generazione-test-riparazione:**

Per test completi, Verdent usa cicli multipass:

1. **Genera**: crea la suite di test iniziale
2. **Esegui**: esegue i test per verificarne il funzionamento
3. **Ripara**: corregge i test falliti o migliora la copertura
4. **Itera**: ripete finché i test non passano e la copertura non è sufficiente

Questo garantisce che i test non vengano solo scritti, ma funzionino effettivamente in modo corretto con il tuo codebase.

<Tip>
  Verdent analizza i tuoi test esistenti per rispecchiare le tue convenzioni. Più i tuoi pattern di test esistenti sono coerenti, meglio i test generati da Verdent si allineeranno allo stile del tuo progetto.
</Tip>

***

## Framework di test supportati [#framework-di-test-supportati]

Verdent supporta tutti i principali framework di test tra i diversi linguaggi di programmazione e stack tecnologici senza richiedere configurazioni aggiuntive.

<Tabs>
  <Tab title="JavaScript/TypeScript">
    **Framework di test unitari:**

    <CodeGroup>
      ```javascript Jest
      test('sum returns correct result', () => {
        expect(sum(2, 3)).toBe(5);
      });
      ```

      ```javascript Mocha
      const assert = require('assert');

      describe('sum', () => {
        it('returns correct result', () => {
          assert.strictEqual(sum(2, 3), 5);
        });
      });
      ```

      ```javascript Vitest
      import { describe, it, expect } from 'vitest';

      it('sum returns correct result', () => {
        expect(sum(2, 3)).toBe(5);
      });
      ```

      ```javascript Jasmine
      describe('sum', () => {
        it('returns correct result', () => {
          expect(sum(2, 3)).toEqual(5);
        });
      });
      ```
    </CodeGroup>

    **Test specifici per framework:**

    * **React Testing Library** - Test di componenti React orientati all'utente
    * **Vue Test Utils** - Libreria di test ufficiale di Vue.js

    **Test end-to-end:**

    * **Cypress** - Test end-to-end e di componenti
    * **Playwright** - Test end-to-end cross-browser
    * **Puppeteer** - Test con Chrome headless
  </Tab>

  <Tab title="Python">
    * **Pytest** - Il framework di test Python più diffuso
    * **unittest** - Framework di test integrato in Python
    * **nose2** - Estende unittest con plugin
    * **doctest** - Test incorporati nelle docstring

    Verdent genera test con fixture, parametrizzazione e pattern di asserzione appropriati, che rispecchiano il tuo stile di test in Python.
  </Tab>

  <Tab title="Java e JVM">
    * **JUnit** - Framework di test standard per Java (JUnit 4, JUnit 5)
    * **TestNG** - Framework di test con funzionalità avanzate
    * **Mockito** - Framework di mocking per Java
    * **AssertJ** - Libreria di asserzioni fluent

    Verdent crea test con annotazioni, metodi del ciclo di vita e asserzioni che seguono le convenzioni di test di Java.
  </Tab>

  <Tab title="Altri linguaggi">
    * **RSpec** (Ruby) - Framework per lo sviluppo behavior-driven
    * **PHPUnit** (PHP) - Framework di test unitari per PHP
    * **Go testing** (Go) - Pacchetto di test integrato in Go
    * **xUnit** (C#/.NET) - Framework di test per .NET
    * **Catch2** (C++) - Framework di test moderno per C++

    Verdent si adatta agli idiomi di test del tuo linguaggio e genera test che rispecchiano le convenzioni del tuo progetto.
  </Tab>
</Tabs>

Verdent riconosce il tuo framework di test dalla configurazione del progetto e dai test esistenti, generando automaticamente test che rispecchiano il tuo setup.

***

## Generare test di integrazione [#generare-test-di-integrazione]

Verdent genera test di integrazione che verificano come più componenti, servizi o moduli funzionano insieme. Crea test che simulano flussi di lavoro reali, comprese interazioni con API, operazioni sul database, flussi di autenticazione e percorsi utente multi-step.

**Esempio:**

```
Write integration tests for the user registration flow
```

Verdent genera test che verificano il flusso completo:

1. **Invio del modulo**: l'utente invia il modulo di registrazione con dati validi
2. **Validazione**: il backend valida il formato dell'email, la robustezza della password e la completezza dei dati
3. **Inserimento nel database**: il record utente viene creato nel database
4. **Invio dell'email**: viene inviata l'email di conferma (simulata o reale)
5. **Login riuscito**: il nuovo utente può accedere immediatamente con le proprie credenziali

**Struttura dei test di integrazione:**

Verdent crea test di integrazione con:

* **Setup del test**: seeding del database, inizializzazione dei servizi, creazione dei dati di test
* **Simulazione del flusso di lavoro**: operazioni multi-step in sequenza
* **Verifica dello stato**: controllo dello stato del database, delle risposte di API, degli effetti collaterali
* **Mocking dei servizi esterni**: servizi di email, API di pagamento, integrazioni di terze parti
* **Teardown del test**: pulizia dei dati di test, rollback del database, arresto dei servizi

**Esempi di scenari di test:**

```
Write integration tests for the checkout and payment process
```

Verdent testa:

* L'aggiunta di articoli al carrello
* L'applicazione di codici sconto
* Il calcolo dei totali con tasse e spedizione
* L'elaborazione del pagamento (con gateway di pagamento simulato)
* La creazione del record dell'ordine nel database
* L'invio dell'email di conferma
* L'aggiornamento dell'inventario

**Isolamento dei test:**

Verdent garantisce che i test di integrazione siano correttamente isolati:

* Ogni test parte con uno stato del database pulito
* Le chiamate ai servizi esterni sono simulate per prevenire effetti collaterali
* I test possono essere eseguiti in qualsiasi ordine senza dipendenze
* La pulizia avviene anche se i test falliscono

<Tip>
  I test di integrazione beneficiano di ambienti di test isolati: Verdent può aiutarti a configurare le fixture del database e a simulare i servizi esterni.
</Tip>

<Note>
  I test di integrazione verificano che i componenti funzionino correttamente insieme. Sono più complessi dei test unitari, ma offrono una maggiore garanzia che i flussi di lavoro reali funzionino come previsto.
</Note>

***

## Migliorare la copertura dei test [#migliorare-la-copertura-dei-test]

Verdent analizza il tuo codebase per individuare funzioni, branch e casi limite non testati, quindi genera test per migliorare la copertura. Esamina la tua suite di test esistente e individua le lacune in cui i percorsi di codice non vengono esercitati.

**Esempio:**

```
Analyze test coverage and write tests for uncovered code paths in the payment module
```

Verdent farà quanto segue:

1. **Analizzare i test esistenti**: esaminare ciò che è attualmente testato
2. **Individuare le lacune di copertura**: trovare funzioni specifiche, branch condizionali, percorsi di gestione degli errori e casi limite privi di test
3. **Generare i test mancanti**: creare test mirati al codice non coperto
4. **Verificare il miglioramento della copertura**: eseguire i test per confermare l'aumento della copertura

**Cosa individua Verdent:**

* **Funzioni non testate**: funzioni prive di qualsiasi copertura di test
* **Branch condizionali**: istruzioni if/else in cui un branch non è testato
* **Percorsi di gestione degli errori**: blocchi try/catch o callback di errore senza test di fallimento
* **Casi limite**: valori di confine, gestione di null/undefined, coercizione di tipo
* **Punti di integrazione**: chiamate a API, operazioni sul database, interazioni con servizi esterni

**Esempio di miglioramento della copertura:**

```
Improve test coverage for the UserService class
```

Verdent individua:

* `getUserById` ha test per ID validi ma non per ID non validi
* `updateUser` manca di test per i fallimenti di validazione
* `deleteUser` manca di test per i controlli di autorizzazione
* I percorsi di gestione degli errori in `createUser` non sono testati

Quindi genera test mirati specificamente a queste lacune, aumentando la copertura dal 65% al 95%.

**Metriche di copertura:**

Verdent ti aiuta a raggiungere percentuali di copertura più elevate e a intercettare potenziali bug in codice precedentemente non testato:

* **Copertura delle righe**: percentuale di righe di codice eseguite dai test
* **Copertura dei branch**: percentuale di branch condizionali testati
* **Copertura delle funzioni**: percentuale di funzioni con almeno un test
* **Copertura delle istruzioni**: percentuale di istruzioni eseguite

***

## Debug con Verdent [#debug-con-verdent]

Verdent aiuta nel debug analizzando i messaggi di errore, tracciando il flusso di esecuzione, individuando le cause profonde e suggerendo correzioni. Incolla i log degli errori, descrivi il comportamento inatteso o chiedi a Verdent di investigare problemi specifici.

<Tabs>
  <Tab title="Comportamento inatteso">
    Descrivi cosa non funziona e cosa ti aspettavi:

    ```
    This function returns undefined instead of the user object. Debug it.
    ```

    Verdent farà quanto segue:

    * Leggerà l'implementazione della funzione
    * Traccerà il flusso di esecuzione
    * Individuerà dove il percorso di codice va storto (istruzione return mancante, condizionale errata, problema con async/await)
    * Proporrà una correzione con relativa spiegazione
    * Suggerirà casi di test per prevenire regressioni

    **Esempio:**

    ```
    The login form redirects to the home page even when credentials are invalid
    ```

    Verdent farà quanto segue:

    * Esaminerà la logica di invio del modulo di login
    * Traccerà il flusso di autenticazione
    * Individuerà il bug (il redirect avviene prima che la validazione asincrona sia completata)
    * Proporrà una correzione (attendere la validazione prima del redirect)
  </Tab>

  <Tab title="Problemi di prestazioni">
    Richiedi un'analisi delle prestazioni:

    ```
    The product search is slow when the database has 10,000+ products
    ```

    Verdent farà quanto segue:

    * Analizzerà l'implementazione della query di ricerca
    * Individuerà l'inefficienza (query N+1, indice del database mancante, algoritmo inefficiente)
    * Suggerirà un'ottimizzazione (aggiungere un indice al database, raggruppare le query, memorizzare i risultati in cache)

    Il debug delle prestazioni aiuta a individuare i colli di bottiglia negli algoritmi, nelle query del database o nelle risposte di API che rallentano la tua applicazione.
  </Tab>

  <Tab title="Flusso di esecuzione">
    Comprendi come viene eseguito il codice:

    ```
    Why does this API endpoint return a 500 error when the email parameter is missing?
    ```

    Verdent farà quanto segue:

    * Traccerà la gestione della richiesta dall'endpoint alla validazione fino al database
    * Individuerà dove si verifica l'errore (accesso a una proprietà di undefined)
    * Spiegherà perché si verifica l'errore (controllo null mancante prima dell'accesso alla proprietà)
    * Suggerirà una correzione difensiva (validare i parametri prima di usarli)

    Il tracciamento del flusso di esecuzione ti aiuta a comprendere il percorso seguito dal tuo codice e dove devia dal comportamento atteso.
  </Tab>
</Tabs>

<Tip>
  Incolla i messaggi di errore o gli stack trace direttamente nella chat. Verdent analizza l'errore, individua il codice problematico e spiega cosa è andato storto, con percorsi dei file e numeri di riga specifici.
</Tip>

***

## Diagnosticare da messaggi di errore e log [#diagnosticare-da-messaggi-di-errore-e-log]

Incolla messaggi di errore, stack trace o file di log direttamente nella chat. Verdent analizza l'errore, individua il file di origine e il numero di riga, spiega la causa e suggerisce una correzione.

<Tabs>
  <Tab title="Stack trace">
    Incolla messaggi di errore e stack trace:

    ```
    TypeError: Cannot read property 'name' of undefined
        at UserProfile.render (UserProfile.jsx:45)
        at processComponent (react-dom.js:2103)
    ```

    Incolla questo in Verdent:

    ```
    I'm getting this error: [paste stack trace]
    ```

    Verdent farà quanto segue:

    * Identificherà il tipo di errore (TypeError da accesso a null/undefined)
    * Individuerà la riga esatta (`UserProfile.jsx:45`)
    * Leggerà il codice in quella posizione
    * Spiegherà perché si verifica (l'oggetto user è undefined prima che i dati vengano caricati)
    * Proporrà correzioni:
      * Aggiungere un controllo null: `if (!user) return <Loading />`
      * Usare l'optional chaining: `user?.name`
      * Assicurarsi che i dati vengano caricati prima del rendering del componente
  </Tab>

  <Tab title="Analisi dei log">
    Incolla file di log o output della console per l'analisi:

    ```
    Analyze these logs and tell me why the API requests are failing:
    [paste 50 lines of log output]
    ```

    Verdent farà quanto segue:

    * Scansionerà i log alla ricerca di pattern di errore
    * Individuerà fallimenti di autenticazione, timeout di rete o errori del database
    * Traccerà la sequenza di eventi che ha portato al fallimento
    * Suggerirà correzioni in base al pattern di errore

    L'analisi dei log aiuta a individuare pattern tra più fallimenti e a comprendere la sequenza di eventi che ha portato agli errori.
  </Tab>

  <Tab title="Debug multi-step">
    Per problemi complessi, Verdent usa il debug multi-step:

    1. **Analizza i log degli errori** per individuare il punto di fallimento
    2. **Legge il codice pertinente** per comprendere l'implementazione
    3. **Traccia il flusso di esecuzione** per trovare dove le cose vanno storte
    4. **Suggerisce correzioni** con esempi di codice
    5. **Genera test** per prevenire regressioni

    **Esempio:**

    ```
    The shopping cart total is sometimes incorrect. Here are the error logs: [paste logs]
    ```

    Verdent farà quanto segue:

    1. Analizzerà i log e individuerà quando si verifica il bug (quando vengono applicati i codici sconto)
    2. Leggerà la logica di calcolo dello sconto
    3. Individuerà il bug (lo sconto è calcolato prima delle tasse, non dopo)
    4. Proporrà una correzione (riordinare i passaggi di calcolo)
    5. Suggerirà casi di test (carrello con sconto, carrello con tasse, carrello con entrambi)
  </Tab>
</Tabs>

***

## Best practice [#best-practice]

<Accordion title="Genera i test presto">
  Scrivi i test man mano che sviluppi le funzionalità, non dopo il completamento. Verdent può generare test immediatamente dopo la creazione di nuove funzioni o componenti.
</Accordion>

<Accordion title="Usa i test esistenti come guide di stile">
  Verdent rispecchia i pattern di test del tuo progetto. Mantieni una struttura di test coerente affinché Verdent generi test allineati alle tue convenzioni.
</Accordion>

<Accordion title="Richiedi esplicitamente test per i casi limite">
  Chiedi a Verdent di testare condizioni di confine, scenari di errore e input insoliti: "Scrivi test che includano casi limite per input non validi e valori di confine."
</Accordion>

<Accordion title="Incolla i messaggi di errore direttamente">
  Non parafrasare gli errori. Incolla lo stack trace completo per una diagnosi accurata e una risoluzione più rapida.
</Accordion>

<Accordion title="Descrivi il comportamento atteso rispetto a quello effettivo">
  Quando esegui il debug, indica chiaramente cosa ti aspettavi che accadesse e cosa è effettivamente accaduto. Questo contesto aiuta Verdent a individuare la causa profonda.
</Accordion>

<Accordion title="Usa i test multipass per funzionalità complesse">
  Per le funzionalità critiche, richiedi una generazione completa di test con cicli multipass: "Genera test completi per il modulo di pagamento e verifica che passino tutti."
</Accordion>

<Accordion title="Testa dopo il refactoring">
  Dopo aver eseguito il refactoring del codice, richiedi test per verificare che la funzionalità sia preservata: "Genera test per verificare che il modulo di autenticazione sottoposto a refactoring funzioni correttamente."
</Accordion>

<Accordion title="Combina il debug con la generazione di test">
  Dopo aver corretto un bug, richiedi un test per prevenire regressioni: "Scrivi un test che garantisca che questo bug non si ripeta."
</Accordion>

***

## Vedi anche [#vedi-anche]

<CardGroup cols="2">
  <Card title="Scrivere nuovo codice" icon="code" href="/docs/verdent-for-vscode/task-based-guides/writing-code">
    Scopri come scrivere nuove funzionalità con l'assistenza AI di Verdent
  </Card>

  <Card title="Refactoring del codice" icon="wrench" href="/docs/verdent-for-vscode/task-based-guides/refactoring">
    Migliora la qualità del codice attraverso flussi di lavoro di refactoring sicuri
  </Card>
</CardGroup>
