Il problema: l'output non è deterministico, il assertEqual classico non basta. La cassetta degli attrezzi:
- separa il testabile: parsing, retrieval, tool, validazioni sono codice normale – test normali. Il modello va isolato dietro un'interfaccia, così i test d'integrazione girano anche con un mock
- golden test sul non deterministico: il golden set gira in CI – metriche esatte dove l'output è strutturato, LLM-as-a-judge con rubrica dove è prosa, soglie che fanno fallire la build ("correttezza < 90% = rosso")
- test di regressione sui prompt: ogni modifica al prompt passa dal golden set prima del merge – i prompt sono codice, si trattano da codice
- test avversariali: input malformati, tentativi di injection, casi limite – è il red teaming dei poveri, e trova sempre qualcosa
Filosofia collaudata qui: questo stesso sito ha una batteria draconiana che blocca ogni modifica se una risposta canonica smette di matchare – il principio è identico, deterministico o no.