Testgenerering och standarder
Dokumentera fixtures och standarder för att förbättra genererade tester.
Testgenerering och standarder är en gratis lektion i Claude Architect på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Claude Architect, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Claude Architect innehåller totalt 4 lektioner.
Därför börjar genererade tester avvika
Om ni ber Claude Code att "write tests for this module" utan vägledning får ni tester som körs men inte följer er lokala stil: felaktiga hjälpfunktioner från testramverket, påhittade fixtures och assertioner som speglar implementationen i stället för kontraktet.
Lösningen är inte en bättre engångsprompt. Det är bestående, gemensamma standarder som modellen läser vid varje körning. I den här lektionen visar vi hur ni dokumenterar fixtures och konventioner så att genererade tester blir idiomatiska, deterministiska och möjliga att granska, både i interaktiva sessioner och i CI.
Standarder hör hemma i CLAUDE.md på projektnivå
Testkonventioner hör hemma i konfiguration på projektnivå, så att alla som bidrar och alla CI-körningar ser dem. Lägg dem i ./CLAUDE.md eller .claude/CLAUDE.md, som delas via VCS.
Förlita er INTE på ~/.claude/CLAUDE.md på användarnivå: den är personlig och delas INTE via versionshantering, så nya teammedlemmar och er pipeline kommer helt enkelt inte att ha tillgång till den. Allt som testgenereringen är beroende av måste finnas på projektnivå.
# ./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 fixturesModularisera med @path-importer
En monolitisk CLAUDE.md blir svårläst och förbrukar kontext. Flytta den detaljerade testmanualen till en egen fil och importera den med syntaxen @path. Då hålls rotfilen kort samtidigt som standarden fortfarande läses in.
Den importerade filen är vanlig markdown och versionshanteras som allt annat, så standarden kan återanvändas och enkelt granskas separat.
# ./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.Läs in testregler endast vid behov
Ännu bättre än importer som alltid är aktiva är att lägga testkonventioner i en fil i .claude/rules/ med YAML-frontmatter och paths. Regeln läses in endast när matchande filer redigeras, så ni sparar kontext och tokens jämfört med en monolitisk CLAUDE.md som skickar med allt vid varje tur.
Begränsa regeln till er testkatalog så aktiveras den exakt när Claude genererar eller redigerar tester, och håller sig annars ur vägen.
# .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 caseDokumentera fixtures som sanningskälla
Den överlägset vanligaste orsaken till dåliga genererade tester är påhittade fixtures: modellen hittar på ett användarobjekt eller en DB-stubb i stället för att använda era. Dokumentera de riktiga fixturerna så att Claude återanvänder dem.
Beskriv tydligt vad varje fixture tillhandahåller, dess struktur och när den ska användas. Se detta som en verktygsbeskrivning: syfte, returvärde, indataformat och gränser för användbarhet är det som styr rätt val.
# ./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.Few-shot-exempel slår vaga regler
Enbart löptext lämnar utrymme för tvetydighet. Lägg till 2 till 4 riktade exempel på ett kanoniskt test så att modellen generaliserar mönstret i stället för att bara kopiera det. Few-shot-exempel är det effektivaste sättet att skapa konsekvens, hantera specialfall och styra utdataformatet.
Visa ett komplett, idiomatiskt test som använder era riktiga fixtures. Nya tester kommer att efterlikna dess struktur, namngivning och assertion-stil.
# ./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.Skriv tydliga kriterier, inte vaga önskemål
"Write good tests" är ett vagt önskemål. Tydliga kriterier ger tillförlitlig utdata. Jämför "be thorough" med "cover the happy path, one boundary value, and one error path; never test private methods directly."
Konkreta, kontrollerbara regler tar bort de gissningar som gör att genererade tester blir inkonsekventa mellan filer och personer som bidrar.
# 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 textKapsla in genereringen som en Skill
Gör arbetsflödet repeterbart med en Skill i .claude/skills/ (projektomfattning delas via VCS, medan användaromfattning är personlig). Skillen samlar er standard och kan begränsa verktyg samt isolera utdata.
Använd context: fork för att isolera utförlig genereringsutdata, allowed-tools för att begränsa vad den får påverka och argument-hint för att vägleda den som anropar den. Nu är "generate tests to standard" ett återanvändbart kommando i stället för ett stycke som måste skrivas om.
# .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.Hitta mönster innan ni genererar
Generera inte i ett vakuum. Låt Claude först följa mönstret stegvis undersökning: använd Glob för att hitta befintliga testfiler, Read för att läsa ett par av dem, Grep för att se hur en fixture används och skriv sedan ett nytt test som passar in bland de befintliga.
Att förankra genereringen i den verkliga kodbasen slår att rabbla en stilguide, eftersom modellen kopierar levande, fungerande konventioner i stället för att gissa.
# 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."Generera headless och granska i en ny session i CI
I en pipeline genererar ni tester headless med -p (obligatoriskt eftersom ingen människa är närvarande) och --output-format json, så att ett senare steg kan tolka resultatet. Granska sedan de genererade testerna i en separat, isolerad session.
Granskning i en ny instans slår självgranskning i samma session: upphovspersonen behåller sitt eget resonemang och kommer inte att ifrågasätta sina egna tester. En ren granskare upptäcker tautologiska assertioner och saknade felvägar som generatorn missade.
# 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.jsonValidera strukturen och försök sedan igen med återkoppling
När ni ber om tester i strukturerat format (tool_use + JSON Schema) ska ni validera resultatet. Om det är felaktigt formaterat använder ni retry-with-feedback: skicka den ursprungliga begäran, den felaktiga utdatan och det exakta valideringsfelet igen. Det rättar till format- och strukturfel på ett tillförlitligt sätt.
Två varningar från faktabladet: retry hjälper INTE när den information som behövs helt enkelt saknas i källan, och ett schemafält ska markeras som required endast om det alltid finns med, annars kommer modellen att hitta på det.
# 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.Snabbkontroll
Tillämpa lektionen på ett realistiskt beslut om standarder.
Sammanfattning: testgenerering och standarder
Viktiga slutsatser:
- Placera teststandarder på projektnivå (
./CLAUDE.md,.claude/rules/medpaths) och dela dem via VCS. Förlita er aldrig på personlig~/.claude/CLAUDE.mdi CI. - Modularisera med
@path-importer. Regler med frontmatter ochpathsläses endast in när matchande filer redigeras, vilket sparar kontext. - Dokumentera fixtures som sanningskälla (syfte, struktur och när de ska användas), så att modellen återanvänder dem i stället för att hitta på stubbar.
- Few-shot (2–4 kanoniska exempel) tillsammans med tydliga kriterier slår vaga instruktioner; modellen generaliserar mönstret.
- Samla allt i en Skill i
.claude/skills/och låt Claude undersöka befintliga tester (Glob/Read/Grep) innan nya skrivs. - I CI genererar ni headless med
-p --output-format jsonoch granskar sedan i en ny, isolerad session. - Validera strukturerad utdata. retry-with-feedback rättar formatfel men inte saknad information, och ett schemafält ska endast krävas om det alltid finns med.
Lär dig Python med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 26
- Lektioner
- 104
Vanliga frågor
Är lektionen ”Testgenerering och standarder” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Claude Architect, inklusive ”Testgenerering och standarder”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Claude Architect innehåller totalt 4 lektioner.
Vad lär jag mig i ”Testgenerering och standarder”?
Dokumentera fixtures och standarder för att förbättra genererade tester. Ni övar på Claude Architect med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Claude Architect?
Du behöver inga förkunskaper. Utbildningen i Claude Architect på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Testgenerering och standarder”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Claude Architect-lektionen?
Ja. Varje Claude Architect-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Icke-interaktivt läge
- Strukturerad utdata
- Sessionsisolering för granskningar
- Testgenerering och standarder