Test e debug
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
- 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
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
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 functionVerdent 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:
- Genera: crea la suite di test iniziale
- Esegui: esegue i test per verificarne il funzionamento
- Ripara: corregge i test falliti o migliora la copertura
- 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.
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.
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.
Framework di test unitari:
test('sum returns correct result', () => {
expect(sum(2, 3)).toBe(5);
});const assert = require('assert');
describe('sum', () => {
it('returns correct result', () => {
assert.strictEqual(sum(2, 3), 5);
});
});import { describe, it, expect } from 'vitest';
it('sum returns correct result', () => {
expect(sum(2, 3)).toBe(5);
});describe('sum', () => {
it('returns correct result', () => {
expect(sum(2, 3)).toEqual(5);
});
});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
- 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.
- 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.
- 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.
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
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 flowVerdent genera test che verificano il flusso completo:
- Invio del modulo: l'utente invia il modulo di registrazione con dati validi
- Validazione: il backend valida il formato dell'email, la robustezza della password e la completezza dei dati
- Inserimento nel database: il record utente viene creato nel database
- Invio dell'email: viene inviata l'email di conferma (simulata o reale)
- 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 processVerdent 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
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.
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.
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 moduleVerdent farà quanto segue:
- Analizzare i test esistenti: esaminare ciò che è attualmente testato
- Individuare le lacune di copertura: trovare funzioni specifiche, branch condizionali, percorsi di gestione degli errori e casi limite privi di test
- Generare i test mancanti: creare test mirati al codice non coperto
- 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 classVerdent individua:
getUserByIdha test per ID validi ma non per ID non validiupdateUsermanca di test per i fallimenti di validazionedeleteUsermanca di test per i controlli di autorizzazione- I percorsi di gestione degli errori in
createUsernon 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
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.
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 invalidVerdent 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)
Richiedi un'analisi delle prestazioni:
The product search is slow when the database has 10,000+ productsVerdent 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.
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.
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.
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.
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
- Aggiungere un controllo null:
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.
Per problemi complessi, Verdent usa il debug multi-step:
- Analizza i log degli errori per individuare il punto di fallimento
- Legge il codice pertinente per comprendere l'implementazione
- Traccia il flusso di esecuzione per trovare dove le cose vanno storte
- Suggerisce correzioni con esempi di codice
- Genera test per prevenire regressioni
Esempio:
The shopping cart total is sometimes incorrect. Here are the error logs: [paste logs]Verdent farà quanto segue:
- Analizzerà i log e individuerà quando si verifica il bug (quando vengono applicati i codici sconto)
- Leggerà la logica di calcolo dello sconto
- Individuerà il bug (lo sconto è calcolato prima delle tasse, non dopo)
- Proporrà una correzione (riordinare i passaggi di calcolo)
- Suggerirà casi di test (carrello con sconto, carrello con tasse, carrello con entrambi)
Best practice
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.
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.
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."
Incolla i messaggi di errore direttamente
Non parafrasare gli errori. Incolla lo stack trace completo per una diagnosi accurata e una risoluzione più rapida.
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.
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."
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."
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."