Generování testů s AI
Přejít na sekci
Anatomie dobrého AI-generovaného testu
AI může generovat testy rychle, ale ne všechny AI-generované testy jsou dobré. Dobrý test má jasný účel, testuje jednu věc, má srozumitelný název a je udržovatelný. V této lekci se naučíte prompt vzory, které vedou ke kvalitním testům.
Nejčastější chyba při AI generování testů: nechat AI generovat testy bez kontextu. AI pak píše testy, které testují implementaci (mockují všechno) místo chování. Vždy poskytněte kontext — co je účel funkce, ne jak je implementována.
Prompt vzory pro unit testy
Pattern 1: Behavior-driven prompt
Místo 'napiš testy pro tuto funkci' popište chování, které chcete otestovat:
# Špatný prompt
"Napiš testy pro funkci calculate_discount()"
# Dobrý prompt
"Napiš testy pro calculate_discount(). Funkce:
- Vrací 0% slevu pro objednávky pod 1000 Kč
- Vrací 5% slevu pro objednávky 1000–4999 Kč
- Vrací 10% slevu pro objednávky 5000+ Kč
- Vrací 15% slevu pro VIP zákazníky bez ohledu na částku
- Raises ValueError pro záporné částky
Testuj každý boundary case a kombinace VIP + částka.
Použij pytest, bez mocků."Pattern 2: Test-first prompt
Nechte AI napsat testy PŘED tím, než napíše implementaci. Toto je TDD s AI:
# Prompt: "Napiš pytest testy pro funkci parse_csv_row(),
# která bere CSV řádek jako string a vrací dict.
# Očekávané chování:
# - Standardní řádek: 'Jan,Novak,30' -> {'first': 'Jan', 'last': 'Novak', 'age': 30}
# - Prázdné pole: 'Jan,,30' -> {'first': 'Jan', 'last': '', 'age': 30}
# - Quotes: '"Jan, Jr.",Novak,30' -> {'first': 'Jan, Jr.', 'last': 'Novak', 'age': 30}
# - Prázdný string: raises ValueError
# - Špatný počet polí: raises ValueError"
# AI vygeneruje:
import pytest
from myapp.parsers import parse_csv_row
def test_standard_row():
result = parse_csv_row("Jan,Novak,30")
assert result == {"first": "Jan", "last": "Novak", "age": 30}
def test_empty_field():
result = parse_csv_row("Jan,,30")
assert result == {"first": "Jan", "last": "", "age": 30}
def test_quoted_field_with_comma():
result = parse_csv_row('"Jan, Jr.",Novak,30')
assert result == {"first": "Jan, Jr.", "last": "Novak", "age": 30}
def test_empty_string_raises():
with pytest.raises(ValueError):
parse_csv_row("")
def test_wrong_field_count_raises():
with pytest.raises(ValueError):
parse_csv_row("Jan,Novak")Pattern 3: Existing code + coverage gap
Dejte AI existující kód A existující testy a požádejte o doplnění coverage:
"Tady je implementace [vložit kód] a tady jsou existující testy
[vložit testy]. Coverage report ukazuje, že řádky 45–67
nejsou pokryty. Napiš testy, které pokryjou tyto řádky.
Zaměř se na error handling a edge cases."Generování integračních testů
Integrační testy jsou složitější než unit testy — testují interakci mezi komponentami. Pro AI je klíčové poskytnout kontext o všech zúčastněných komponentách:
# Prompt pro integrační test:
# "Napiš integrační test pro endpoint POST /api/payments/create/.
# Endpoint očekává JWT autentizaci, payload s course_slug,
# vytvoří Payment v DB a vrátí redirect URL.
# Použij pytest + Django test client. Reálná DB, žádné mocky
# kromě externího Comgate API (použij respx)."
# AI vygeneruje:
import pytest
import respx
from httpx import Response
@pytest.mark.django_db
def test_create_payment_success(authenticated_client, course):
with respx.mock:
respx.post("https://payments.comgate.cz/v1.0/create").mock(
return_value=Response(200, json={
"code": 0,
"transId": "ABC-123",
"redirect": "https://payments.comgate.cz/pay/ABC-123"
})
)
response = authenticated_client.post(
"/api/payments/create/",
data={"course_slug": course.slug},
content_type="application/json",
)
assert response.status_code == 200
data = response.json()
assert "redirect_url" in data
assert Payment.objects.filter(user=authenticated_client.user).exists()Coverage analýza s AI
AI může pomoci nejen psát testy, ale i analyzovat coverage a navrhovat, kde přidat testy:
# 1. Vygenerujte coverage report
pytest --cov=myapp --cov-report=json
# 2. Nechte AI analyzovat coverage gaps
claude "Analyzuj coverage report v coverage.json.
Identifikuj 5 nejdůležitějších nepokrytých oblastí
a napiš testy pro ně. Prioritizuj podle:
1. Business-kritické funkce
2. Error handling cesty
3. Edge cases v datové validaci"Review AI-generovaných testů
Každý AI-generovaný test musíte reviewovat. Hledejte tyto problémy:
- Tautologické testy — test, který testuje, že implementace dělá to, co dělá (assert result == function(input))
- Nadměrné mockování — test, který mockuje všechno a netestuje nic reálného
- Chybějící assertions — test, který projde vždy, protože nemá assert na správném místě
- Hard-coded hodnoty — test, který projde jen pro konkrétní data a selhává při změně
- Chybějící cleanup — test, který zanechává stav (soubory, DB záznamy) a ovlivňuje další testy
Pravidlo palce: pokud nerozumíte, co test testuje, do 5 sekund od přečtení, test je špatný. AI často píše testy s nejasným názvem. Přepište název testu tak, aby popisoval očekávané chování, ne implementační detail.
Vyberte jeden modul ve vašem projektu, který nemá dostatečné testy: 1. Spusťte coverage report a identifikujte nepokryté řádky 2. Použijte AI (Claude Code, Copilot, nebo Cursor) k vygenerování testů 3. Použijte všechny tři prompt vzory: behavior-driven, test-first, coverage gap 4. Reviewujte každý generovaný test podle checklistu výše 5. Spusťte testy a ověřte, že prochází a zvedají coverage Porovnejte kvalitu testů z různých prompt vzorů. Který vzor produkoval nejlepší testy?
Nápověda
Začněte s jednoduchou utility funkcí — čistý vstup, čistý výstup, žádné side effecty. Tam AI exceluje. Pak zkuste složitější funkci s databází nebo API voláním. Uvidíte, kde AI začíná potřebovat víc kontextu.
- Behavior-driven prompty produkují lepší testy než generické 'napiš testy pro X'
- Poskytněte AI kontext o očekávaném chování, ne jen o implementaci
- Vždy reviewujte AI-generované testy — hledejte tautologie, nadměrné mocky a chybějící asserty
- TDD s AI: nechte AI napsat testy před implementací
- Coverage gap analýza: dejte AI coverage report a nechte ho doplnit chybějící testy
V příští lekci se ponoříme do Vizuální regresní testování — technika, která vám dá jasnou převahu. Odemkněte celý kurz a pokračujte hned.
2/7 hotovo — pokračujte!