Unità 5 / 12

Test di produzione e garanzia di qualità

Guadagni:

  • Capacità di produrre test unitari, casi limite e analisi del gap di copertura con l'intelligenza artificiale
  • Possibilità di stampare le aspettative del test in base alle specifiche, non al comportamento corrente del codice
  • Capacità di verificare se un test protegge effettivamente inserendo errori

Scrivere i test è uno dei compiti più produttivi che la maggior parte degli sviluppatori rimanda. Una buona suite di test è la prova che il codice funziona come previsto e un'ancora di salvezza per cambiamenti futuri. Il problema è che scrivere i test è ripetitivo e richiede molto tempo, esattamente il tipo di lavoro in cui l’intelligenza artificiale eccelle. Ma c’è un problema: l’intelligenza artificiale spesso testa il comportamento esistente del codice, non il comportamento che dovrebbe essere. Gestire questa differenza è l'essenza di questa unità.

In questa unità imparerai il test unitario (test che testa una funzione da sola, in isolamento), i test dei casi limite e la generazione di dati di test con l'intelligenza artificiale; colmare le lacune nella copertura dei test; e perché fidarsi ciecamente dei test di intelligenza artificiale è pericoloso.

I due lati del test: correzione del comportamento e verifica

Un test può avere due scopi diversi. Il primo è la verifica: verifica che il codice sia corretto, che sia conforme alle specifiche. La seconda è la protezione dalla regressione: congela il comportamento del codice oggi, quindi se qualcuno lo modifica accidentalmente domani, il test si interromperà e avviserà.

L'intelligenza artificiale è molto brava in quest'ultimo; Esamina il codice e genera casi che testano "cosa sta facendo in questo momento". Ma se il codice è sbagliato fin dall’inizio, l’intelligenza artificiale può definire quel comportamento sbagliato come “corretto”. Quindi è necessario rivedere l'affermazione di ogni test prodotto dall'IA: "Il codice restituisce 42 e il test si aspetta 42" non significa che 42 sia la risposta corretta.

Attenzione: se l'IA supera il test non significa che il codice "funziona"; significa semplicemente "si comporta come l'IA si aspetta". Decidi se l'aspettativa è corretta o meno osservando le specifiche.

Passo dopo passo: scrivere test robusti con l'intelligenza artificiale

  1. Fornisci le specifiche, non solo il codice. Se aggiungi l'informazione "Questa funzione dovrebbe fare questo", l'IA può scrivere l'aspettativa corretta; Verificherà il comportamento corrente se fornisci semplicemente il codice.
  2. Richiedi casi limite. Vuoto, nullo, zero, negativo, troppo grande, formato errato, concorrenza: dichiara esplicitamente fuori dal percorso felice.
  3. Specificare la struttura e lo stile del test. "usa pytest", "modello Arrange-Act-Assert", "lascia che ogni test testi una cosa" ecc.
  4. Controllare le aspettative (asserzione). Confrontare con la specifica che ciascuna asserzione controlla per il valore corretto.
  5. Colmare le lacune nell’ambito. Fornisci i test esistenti e chiedi "quali rami e casi non sono stati testati?" farti chiedere; quindi verificare gli ulteriori test prodotti.

Tre mini custodie

Caso 1 — Copertura dal 52% all’85%. La copertura del test di un modulo di servizio è stata del 52%. Il team ha fornito i test esistenti all'IA, ha fatto elencare i rami non testati e generare test per essi. Con la revisione umana, la copertura è aumentata all’85%; Nel processo, l’IA ha scoperto un bug reale (un percorso che restituiva il codice di errore sbagliato) in un ramo del bug che non era mai stato testato prima.

Caso 2 – La trappola della fissazione della falsa aspettativa. Una funzione di arrotondamento del denaro era in realtà sbagliata; Invece di arrotondare 2,675 a 2,67, arrotondava 2,67 invece di 2,68. L'intelligenza artificiale ha esaminato il codice e ha scritto assert round_money(2.675) == 2.67, bloccando l'errore come "vero". Quando lo sviluppatore ha letto le specifiche, ha corretto le aspettative e ha individuato il vero bug. Testare la regola, non il codice, ha fatto la differenza.

Caso 3 – Esplosione dello stato limite. Quando si chiedono all’IA solo “casi limite” per una funzione di intervallo di date; Ha prodotto 8 casi come start=end, intervallo inverso, anno bisestile 29 febbraio, fusi orari diversi e intervallo nullo. Due di questi (spaziatura inversa e anno bisestile) causavano effettivamente l'errore. La considerazione manuale di questi casi viene spesso tralasciata; L'intelligenza artificiale è diventata un partner di "brainstorming sui casi limite" qui.

Quattro modelli copiabili

Generazione di test basata sulle specifiche:

Ruolo: uno sviluppatore che scrive test. Framework: {{pytest/JUnit/Jest...}}. Cosa DOVREBBE FARE la funzione (specifica): {{rule}} Scrivi test per la seguente funzione. Scrivi le aspettative in base alle specifiche, NON all'output corrente del codice. Percorso felice + aggiungi almeno 4 casi limite. Lascia che ogni test testi una cosa, usa un nome descrittivo. {{funzione}}

Brainstorming sui casi limite:

Elenca i casi limite/di errore che dovrebbero essere provati nel test di questa funzione (null, null, punti di interruzione, formato non valido, concorrenza, errore esterno). Per ogni caso: input, comportamento previsto. NON scrivere ancora il codice, basta elencarlo.{{function}}

Analisi del gap di copertura:

Di seguito le funzioni ed i test disponibili. Quali rami, condizioni e casi non sono stati testati? Elenca le carenze e scrivi nuovi test solo per le carenze. Non ripetere quelli esistenti. Funzione:{{funzione}}Test:{{existing_tests}}

Dati di test/generazione di oggetti fittizi:

Genera dati di test realistici per i test {{funzione/servizio}}: campioni validi, campioni di confine e campioni non validi separatamente. Suggerisci un semplice comportamento simulato per la dipendenza esterna {{X}}. Utilizzo di dati/PII realmente riservati; Genera dati falsi.

Prompt debole / Prompt forte

Debole: "Scrivi un test per questa funzione."
Forte: "con pytest. Funzione apply_discount(total, percent) — regola: lo sconto deve essere 0%–30%, fuori dai limiti dovrebbe generare ValueError, il risultato dovrebbe essere arrotondato a 2 decimali. Scrivi le aspettative secondo questa REGOLA (non tramite codice). Percorso felice + questi casi limite: 0%, 30%, 31% (errore), negativo, totale = 0. [codice]"

Fornisce la regola di rilascio forte e dice "scrivi l'aspettativa secondo la regola, non il codice"; Questa singola frase chiude la trappola dell’IA che risolve i comportamenti scorretti.

Tipo di prova

Contributo dell'IA

controllo umano

Buone prove di unità stradali

scheletro veloce

L'aspettativa è corretta?

Casi limite

Ampio brainstorming

Elimina l'irrilevante

Riempimento delle lacune dell'ambito

Trova i rami saltati

Conferma il significato

Dati di prova/falsificazione

Produce un campione realistico

Nessuna PII, controllo del realismo

I test gestiscono la qualità, non la garantiscono

Un'elevata copertura del test dà sicurezza, ma può anche essere fuorviante: una copertura del 100% significa "ogni riga è stata eseguita", non "ogni riga è corretta". È facile aumentare la copertura con l’intelligenza artificiale; Il vero valore sta nello scrivere aspettative significative. Il valore di un test è la sua capacità di rompersi e avvisarti quando il codice viene violato. Ecco perché i test generati dall'intelligenza artificiale si basano sulla domanda "il codice si rompe davvero quando cambia?" Mettilo alla prova con la domanda; Interrompere deliberatamente una riga e vedere l'interruzione del test (idea di mutazione) è la prova che il test ha funzionato.

Suggerimento: per vedere se un test scritto dall'intelligenza artificiale funziona, crea un piccolo bug nel codice (ad esempio cambia un + in un -) e verifica se il test si interrompe. Se non si rompe, quel test non ti protegge.

Errori comuni

  • Chiedere un test senza dare la regola. Il modello congela il comportamento attuale; corregge l'errore come "vero".
  • Accettare le aspettative senza leggerle. Il test è fuorviante se non controlli che le asserzioni stiano controllando il valore corretto.
  • Sto solo testando il percorso felice. Gli errori veri vivono ai margini; Richiedi esplicitamente i casi limite.
  • Confondere l'ambito con lo scopo. Una percentuale elevata non è garanzia di un comportamento corretto.
  • Rendere i dati reali/nascosti come dati di test. I dati o i segreti dei clienti non devono entrare nei test e nell'archiviazione; Genera dati sintetici.

In sintesi

L’intelligenza artificiale elimina gran parte del peso ripetitivo della scrittura dei test: produce scheletri veloci, ampi elenchi di casi limite e analisi dei gap di copertura. Ma il punto più critico sono le aspettative: l’intelligenza artificiale tende a testare il comportamento attuale del codice, mentre i test dovrebbero essere scritti secondo le specifiche. Fornisci la regola, controlla le aspettative, applica i casi limite e verifica se i test effettivamente proteggono inserendo un bug. La copertura del test è uno strumento, non un obiettivo.

Compito dell'applicazione

Seleziona una funzione e stampa prima un test all'AI semplicemente dando il suo codice; Prendi nota delle aspettative. Quindi stampare nuovamente il test, fornendo le specifiche (comportamento richiesto) per la stessa funzione. Confronta le aspettative dei due set di test: ce ne sono di diversi, quale rivela un vero bug? Infine, verifica che uno dei test generati abbia funzionato aggiungendo un bug intenzionale al codice e osservando l'interruzione del test.

lista di controllo

  • [ ] Distinguo se il test serve a fissare o verificare il comportamento.
  • [ ] Quando richiedo un test, fornisco la regola (specifica) che dovrebbe essere in vigore, non il codice.
  • [] Confronto ogni asserzione generata con la specifica.
  • [ ] Richiedo esplicitamente casi limite e di fallimento.
  • [] Considero la copertura percentuale come uno strumento, non come un obiettivo.
  • [ ] Verifico se un test effettivamente protegge inserendo errori.