Claude Architect · Lezione

Generazione dei test e standard

Documenti fixture e standard per migliorare i test generati.

Lezione 4 di 413 passaggi

Generazione dei test e standard è una lezione Claude Architect gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Claude Architect, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Claude Architect include 4 lezioni in totale.

Perché i test generati divergono

Se chiede a Claude Code di "scrivere i test per questo modulo" senza fornire indicazioni, otterrà test che vengono eseguiti ma non rispettano lo stile del team: helper del framework sbagliati, fixture inventate, asserzioni che rispecchiano l'implementazione invece del contratto.

La soluzione non è un prompt occasionale migliore. Sono standard persistenti e condivisi che il modello legge a ogni esecuzione. Questa lezione mostra come documentare fixture e convenzioni, affinché i test generati risultino idiomatici, deterministici e facili da revisionare, sia nelle sessioni interattive sia in CI.

Gli standard risiedono in CLAUDE.md a livello di progetto

Le convenzioni per i test devono appartenere alla configurazione a livello di progetto, così ogni collaboratore e ogni runner CI può vederle. Le inserisca in ./CLAUDE.md o .claude/CLAUDE.md, condivisi tramite VCS.

NON faccia affidamento su ~/.claude/CLAUDE.md a livello utente: è personale e NON viene condiviso tramite il controllo di versione, quindi i nuovi membri del team e la pipeline semplicemente non lo avranno. Tutto ciò da cui dipende la generazione dei test deve risiedere nell'ambito del progetto.

# ./CLAUDE.md  (committed -> every dev + CI sees it)

## Testing standards
- Framework: pytest; one test file per module as tests/test_<module>.py
- Name tests test_<behavior>_<condition>_<expected>
- Assert on the public contract, never on private internals
- No network or real time in unit tests; use the provided fixtures

Modularizzare con import @path

Un CLAUDE.md monolitico diventa difficile da leggere e consuma contesto. Sposti il playbook dettagliato dei test in un file dedicato e lo importi usando la sintassi @path. In questo modo il file principale rimane snello, pur caricando lo standard.

Il file importato è semplice markdown, sottoposto al controllo di versione come tutto il resto; lo standard è quindi riutilizzabile e facile da revisionare separatamente.

# ./CLAUDE.md
@./standards/testing-style.md
@./standards/fixtures.md

# Each imported file documents one slice of the standard,
# keeping the root CLAUDE.md short and scannable.

Caricare le regole dei test solo quando servono

Ancora meglio degli import sempre attivi: inserisca le convenzioni dei test in un file di .claude/rules/ con frontmatter YAML paths. La regola viene caricata solo quando si modificano file corrispondenti, consentendo di risparmiare contesto e token rispetto a un CLAUDE.md monolitico che invia tutto a ogni turno.

Limiti una regola alla directory dei test: si attiverà esattamente quando Claude genera o modifica test e resterà inattiva in tutti gli altri casi.

# .claude/rules/testing.md
---
paths:
  - "tests/**"
  - "**/*.test.ts"
---
# Loaded only when a matching test file is in play
- Arrange-Act-Assert, one logical assertion per test
- Reuse fixtures from conftest.py; never hand-roll a DB
- Cover the happy path, one edge case, and one failure case

Documentare le fixture come fonte autorevole

La causa principale dei test generati in modo errato sono le fixture inventate: il modello fabbrica un oggetto utente o uno stub del database invece di usare quelli esistenti. Documenti le fixture reali, così Claude potrà riutilizzarle.

Specifichi cosa fornisce ogni fixture, la sua struttura e quando utilizzarla. La tratti come la descrizione di uno strumento: scopo, valore restituito, formato dell'input e limiti di applicabilità sono gli elementi che guidano una selezione corretta.

# ./standards/fixtures.md  (imported into CLAUDE.md)

## Available pytest fixtures (use these, do NOT invent)
- `db`        -> in-memory SQLite session, auto-rolled-back per test
- `client`    -> FastAPI TestClient with auth middleware disabled
- `user`      -> a persisted User(id=1, role="member"); returns the ORM obj
- `frozen_now`-> pins datetime.utcnow() to 2026-01-01T00:00:00Z

# Need a different state? Parametrize an existing fixture; don't create a new DB.

Gli esempi few-shot sono migliori delle regole vaghe

La sola prosa lascia spazio all'ambiguità. Aggiunga da 2 a 4 esempi mirati di un test canonico: il modello generalizza lo schema, non si limita a copiarlo. Gli esempi few-shot sono il mezzo più efficace per garantire coerenza, gestire i casi limite e definire il formato dell'output.

Mostri un test completo e idiomatico che utilizzi le fixture reali. I nuovi test ne rispecchieranno la struttura, i nomi e lo stile delle asserzioni.

# ./standards/testing-style.md  (a canonical example to generalize from)

def test_transfer_rejects_when_balance_too_low(db, user):
    account = make_account(db, owner=user, balance=50)
    with pytest.raises(InsufficientFunds):
        transfer(db, account, amount=100)
    assert account.balance == 50          # state unchanged on failure
# ^ Note: AAA layout, real `db`/`user` fixtures, asserts the contract.

Scrivere criteri espliciti, non desideri vaghi

"Scrivere buoni test" è un desiderio vago. I criteri espliciti producono un output affidabile. Confronti "essere esaustivi" con "coprire il percorso principale, un valore di confine e un percorso di errore; non testare mai direttamente i metodi privati."

Regole concrete e verificabili eliminano le supposizioni che rendono incoerenti i test generati tra file e collaboratori diversi.

# In CLAUDE.md or the generation prompt -- explicit and checkable:
- Each public function gets: 1 happy-path, 1 edge/boundary, 1 failure test
- A test may fail for exactly ONE reason; split otherwise
- Mock ONLY at process boundaries (network, clock, filesystem)
- Forbidden: sleeping on real time, hitting a live service, asserting log text

Incapsulare la generazione come skill

Renda il flusso di lavoro ripetibile con una skill in .claude/skills/ (l'ambito del progetto è condiviso tramite VCS, quello dell'utente è personale). La skill raggruppa il Suo standard e può limitare gli strumenti e isolare l'output.

Utilizzi context: fork per isolare l'output dettagliato della generazione, allowed-tools per limitare ciò che può modificare e argument-hint per guidare il chiamante. Ora "generare test secondo lo standard" è un comando riutilizzabile, invece di un paragrafo da riscrivere.

# .claude/skills/gen-tests/SKILL.md
---
name: gen-tests
description: Generate tests for a module using project fixtures + style
context: fork
allowed-tools: [Read, Glob, Grep, Write]
argument-hint: <path/to/module.py>
---
Follow @./standards/testing-style.md and @./standards/fixtures.md.
Find siblings with Glob **/*test*, reuse existing fixtures, then Write the test file.

Individuare gli schemi prima di generare

Non generi nel vuoto. Chieda a Claude di seguire prima lo schema di indagine incrementale: usi Glob per individuare i file di test esistenti, Read per leggerne alcuni, Grep per verificare come viene utilizzata una fixture, quindi scriva un nuovo test coerente con quelli già presenti.

Basare la generazione sul codebase reale è meglio che recitare una guida di stile, perché il modello copia convenzioni vive e funzionanti invece di procedere per supposizioni.

# Glob to discover the established test layout
claude -p "Glob tests/**/*.py, Read two existing tests, \
Grep for usages of the `client` fixture, then write tests/test_orders.py \
following the same fixtures and naming. Do not invent new fixtures."

Generare senza interfaccia e revisionare da una sessione nuova in CI

In una pipeline, generi i test senza interfaccia con -p (obbligatorio: non è presente alcun essere umano) e --output-format json, così un passaggio successivo può analizzare il risultato. Poi revisioni i test generati in una sessione separata e isolata.

La revisione da un'istanza nuova è migliore dell'autovalutazione nella stessa sessione: l'autore conserva il proprio ragionamento e non metterà in discussione i propri test. Un revisore indipendente individua asserzioni tautologiche e casi di errore mancanti che il generatore ha trascurato.

# 1) Generate (headless, parseable)
claude -p "$(cat .ci/gen-tests-prompt.md)" --output-format json > gen.json

# 2) Review in a FRESH session, not the generation context
claude -p "Review the new tests in gen.json against ./standards/testing-style.md. \
Flag tautological asserts and any missing failure-path test." \
  --output-format json > review.json

Convalidare la struttura, poi riprovare con il feedback

Quando richiede test come output strutturato (tool_use + JSON Schema), convalidi il risultato. Se è malformato, utilizzi retry-with-feedback: invii nuovamente la richiesta originale, l'output errato e l'errore di convalida esatto. Questo risolve in modo affidabile gli errori di formato e struttura.

Due avvertenze dalla scheda informativa: retry NON è utile quando l'informazione necessaria è semplicemente assente dalla fonte; inoltre, contrassegni un campo dello schema come required solo se è sempre presente, altrimenti il modello lo inventerà.

# Schema for emitted test cases -- 'edge_case' is optional, so NOT required
{
  "type": "object",
  "properties": {
    "test_name":   {"type": "string"},
    "fixtures":    {"type": "array", "items": {"type": "string"}},
    "assertion":   {"type": "string"},
    "edge_case":   {"type": "string"}
  },
  "required": ["test_name", "fixtures", "assertion"]
}
# On a validation failure: resend original + bad output + the exact error.

Verifica rapida

Applichi la lezione a una decisione realistica sugli standard.

Riepilogo: generazione dei test e standard

Punti chiave:

  • Inserisca gli standard di test nell'ambito del progetto (./CLAUDE.md, .claude/rules/ con paths), condiviso tramite VCS; non faccia mai affidamento sul file personale ~/.claude/CLAUDE.md in CI.
  • Modularizzi con import @path; le regole con frontmatter paths vengono caricate solo quando si modificano file corrispondenti, risparmiando contesto.
  • Documenti le fixture come fonte autorevole (scopo, struttura, momento di utilizzo), così il modello le riutilizza invece di inventare stub.
  • Il few-shot (2-4 esempi canonici) insieme a criteri espliciti è migliore delle istruzioni vaghe; il modello generalizza lo schema.
  • Racchiuda tutto in una skill in .claude/skills/; faccia indagare a Claude i test esistenti (Glob/Read/Grep) prima di scrivere.
  • In CI, generi senza interfaccia con -p --output-format json, poi esegua la revisione in una sessione nuova e isolata.
  • Convalidi l'output strutturato; retry-with-feedback corregge gli errori di formato ma non le informazioni mancanti, e renda obbligatorio un campo dello schema solo se è sempre presente.
Gratis per iniziare

Impara Python con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
26
Lezioni
104

Domande Frequenti

La lezione «Generazione dei test e standard» è gratuita?

Sì — il testo completo di «Generazione dei test e standard» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Claude Architect, passa a CoddyKit PRO. Il corso Claude Architect include 4 lezioni in totale.

Cosa imparerò in «Generazione dei test e standard»?

Documenti fixture e standard per migliorare i test generati. Eserciti Claude Architect con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Claude Architect?

Non è richiesta alcuna esperienza precedente. Claude Architect su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Generazione dei test e standard»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Claude Architect?

Sì. Ogni lezione Claude Architect include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Modalità non interattiva
  2. Output strutturato
  3. Isolamento delle sessioni per le revisioni
  4. Generazione dei test e standard
← Torna a Claude Architect