La tua IA scrive test che non possono mai fallire

Chiedi dei test a un'IA. Ti restituisce dodici test verdi. La tua CI passa. Fai il merge del codice. Tre giorni dopo, un bug arriva in produzione. Guardi i test. Sono passati, ma non hanno testato nulla.

Un test verde non è una prova. È un'ipotesi. L'IA scrive ipotesi che non falliscono mai.

Guarda questa funzione:

func Discount(total int) int {
    if total > 100 {
        return total - 10
    }
    return total
}

Un'IA potrebbe scrivere questo test:

func TestDiscount(t *testing.T) {
    got := Discount(150)
    if got < 0 {
        t.Errorf("result should not be negative")
    }
}

Questo test è verde. Esegue il codice, quindi la tua copertura sembra buona. Ma il test controlla solo se il risultato è inferiore a zero. Se cambi lo sconto in un errore matematico, il test rimane verde. Non controlla il comportamento. Controlla solo se le luci sono accese.

Questa è una trappola. La copertura conta le righe che tocchi. Non conta le asserzioni che contano davvero. Un report di copertura al 90% può nascondere codice rotto.

L'IA cerca la strada più breve verso la luce verde. Sceglie asserzioni deboli e mock che non testano nulla.

Per risolvere il problema, usa una sola regola: verifica che un test sappia come fallire.

Modifica il tuo codice intenzionalmente. Se il test rimane verde, il test è inutile. Buttalo via.

Un vero test è fatto così:

func TestDiscount(t *testing.T) {
    if got := Discount(150); got != 140 {
        t.Errorf("Discount(150) = %d, want 140", got)
    }
}

Se rompi la logica, questo test diventa rosso immediatamente. È implacabile.

Non puoi farlo a mano per ogni test. Usa invece il mutation testing. Strumenti come Gremlins in Go applicano piccole modifiche al tuo codice. Verificano se i tuoi test rilevano i cambiamenti.

Se una modifica non fa fallire un test, hai un buco nella tua suite.

Io uso questo approccio per il codice generato dall'IA. Non permetto a un'IA di dichiarare il proprio lavoro concluso. Eseguo un controllo (gate). Lo strumento muta il codice. Se il test rimane verde, l'IA deve riscriverlo. L'IA non decide se un test è buono. Lo decide la mutazione.

Nessun test dell'IA entra nel mio codebase senza dimostrare di poter fallire. Un test che non può fallire è peggio di nessun test. Un test mancante è ovvio. Un test falso è pericoloso.

Smetti di fidarti delle luci verdi. Un test vale solo per il rosso che può produrre.

Fonte: https://dev.to/ohugonnot/your-ai-writes-tests-that-can-never-fail-3i57

Community di apprendimento opzionale: https://t.me/GyaanSetuAi