AIO APEX
Claude Opus 4.8 (also works well with GPT-5.4 and Gemini 3 Pro for most languages; for niche frameworks, verify generated syntax against current library docs)You just wrote a pricing function for checkout and need a real test suite before it ships, but you have 15 minutes before a deploy window and writing every edge case by hand from scratch would take an hour.Developer Tools

Le générateur de cas de test qui repère les bugs que vos tests de chemin heureux laissent passer

Partager:
Le générateur de cas de test qui repère les bugs que vos tests de chemin heureux laissent passer

Pourquoi ce prompt est important

Untested edge cases in pricing logic are exactly the kind of bug that reaches production silently and gets discovered when a customer gets charged $0 or a discount stacks incorrectly. A 2024 industry survey found that logic errors in boundary conditions account for a disproportionate share of production incidents precisely because they pass casual manual testing but fail on the exact inputs automated tests are designed to catch.

À quoi nous l'utilisons

You just wrote a pricing function for checkout and need a real test suite before it ships, but you have 15 minutes before a deploy window and writing every edge case by hand from scratch would take an hour.

Prompt

Act as a senior QA engineer and test architect with deep experience in [LANGUAGE/FRAMEWORK, e.g. "Python with pytest" or "TypeScript with Jest"].

CONTEXT:
Function or feature to test: [PASTE YOUR FUNCTION, CLASS, OR FEATURE DESCRIPTION HERE]
What it's supposed to do: [ONE-SENTENCE DESCRIPTION OF THE INTENDED BEHAVIOR]
Inputs it receives: [LIST THE PARAMETERS/INPUTS AND THEIR EXPECTED TYPES OR RANGES]
Known constraints or business rules: [ANY VALIDATION RULES, RATE LIMITS, OR EDGE CONDITIONS YOU ALREADY KNOW ABOUT]

TASK:
Generate a comprehensive test suite for this function/feature. Cover four distinct categories of tests:
1. Happy path — normal, expected inputs that should succeed
2. Edge cases — boundary values, empty inputs, maximum/minimum values, unusual-but-valid inputs
3. Error scenarios — invalid inputs, malformed data, and how the function should fail (specific exception types, error codes, or return values)
4. Integration considerations — if this function interacts with external systems (database, API, file system), list what should be mocked and why

CONSTRAINTS:
- Use the testing framework and idioms specified in the context — do not default to a generic framework
- Every test must have a descriptive name that states what it verifies, not just "test1", "test2"
- For each test, include a one-line comment explaining WHY that case matters, not just what it checks
- Do not generate redundant tests that check the same logical branch twice under different names
- Flag any case where you're uncertain about the correct expected behavior rather than guessing silently — mark it with a `# VERIFY:` comment

OUTPUT FORMAT:
1. **Test Suite** — complete, runnable test code in the specified framework
2. **Coverage Summary** — a short table listing each test, its category (happy path/edge/error/integration), and what specific risk it catches
3. **Gaps I Couldn't Cover** — a list of scenarios that need clarification from the developer before a test can be written (ambiguous requirements, undocumented behavior, etc.)

Résultat

Input context: Python function `apply_discount(price: float, discount_pct: float, min_price: float = 0.01) -> float` that applies a percentage discount to a price, but never lets the result drop below `min_price`. Framework: pytest.

1. Test Suite (excerpt):

def test_applies_standard_discount_correctly():
    # Verifies the core discount math works for a typical case
    assert apply_discount(100.0, 20.0) == 80.0

def test_zero_discount_returns_original_price():
    # Edge case: 0% discount should be a no-op, not an error
    assert apply_discount(50.0, 0.0) == 50.0

def test_full_discount_respects_minimum_price_floor():
    # Edge case: 100% discount would give $0, but min_price floor must apply
    assert apply_discount(50.0, 100.0, min_price=1.0) == 1.0

def test_negative_discount_raises_value_error():
    # Error case: a negative discount is a business-logic violation, not a valid input
    with pytest.raises(ValueError):
        apply_discount(50.0, -10.0)

def test_discount_over_100_percent_raises_value_error():
    # Error case: discounts above 100% are nonsensical and should be rejected explicitly
    with pytest.raises(ValueError):
        apply_discount(50.0, 150.0)

def test_negative_price_raises_value_error():
    # Error case: negative prices should never reach this function, but defend anyway
    with pytest.raises(ValueError):
        apply_discount(-10.0, 20.0)

def test_very_small_price_with_discount_stays_above_minimum():
    # Edge case: floating point rounding near the min_price boundary
    result = apply_discount(0.02, 50.0, min_price=0.01)
    assert result >= 0.01

2. Coverage Summary:

TestCategoryRisk It Catches
test_applies_standard_discount_correctlyHappy pathCore math is wrong
test_zero_discount_returns_original_priceEdge caseOff-by-one logic breaks the no-discount case
test_full_discount_respects_minimum_price_floorEdge casePrice floor silently ignored, allowing $0 sales
test_negative_discount_raises_value_errorErrorInvalid input silently accepted, inflating price instead of erroring
test_discount_over_100_percent_raises_value_errorErrorNegative resulting price before floor is applied
test_negative_price_raises_value_errorErrorGarbage input from an upstream bug propagates silently
test_very_small_price_with_discount_stays_above_minimumEdge caseFloating point rounding pushes result just under the floor

3. Gaps I Couldn't Cover:

  • # VERIFY: Should `discount_pct=100` exactly (not over) be allowed, or does it also need special handling? The spec doesn't say if 100% is a valid edge or an error.
  • No information given on whether `price` and `discount_pct` should accept `None` — worth clarifying if this function is called from user input directly.
  • Currency rounding behavior (2 decimal places vs raw float) isn't specified — this affects several boundary test assertions and should be confirmed before merging.

La plupart des développeurs écrivent des tests pour les cas auxquels ils ont déjà pensé, ce qui signifie que les tests confirment surtout ce que le développeur croyait déjà, plutôt que de révéler ce qu'il a manqué. L'écart entre « mon code passe mes tests » et « mon code est réellement correct » réside presque entièrement dans les cas que personne n'a pensé à écrire. Ce prompt est spécifiquement conçu pour chasser dans cet écart.

Pourquoi quatre catégories au lieu de simplement « write tests »

Un prompt nu « write unit tests for this function » produit de manière fiable des happy-path tests et peut-être un error case évident, parce que c'est le chemin de moindre résistance pour tout rédacteur — humain ou modèle. Forcer quatre catégories explicites — happy path, edge cases, error scenarios, integration considerations — modifie le modèle de recherche. Les edge cases poussent spécifiquement le modèle à réfléchir aux limites : zéro, négatif, maximum, vide, null. Les error scenarios le poussent à réfléchir à ce qui devrait échouer bruyamment plutôt que silencieusement, là où se cachent les bogues les plus coûteux. Les integration considerations rattrapent la classe de bogues qui n'apparaît que lorsqu'une dépendance mockée d'une fonction se comporte différemment de la production.

Pourquoi le prompt exige un commentaire « why » sur chaque test

Une suite de tests avec cinquante tests et aucune explication de ce que chacun protège est presque aussi difficile à maintenir qu'aucun test du tout — six mois plus tard, personne ne sait si un test est porteur ou vestigial. Exiger une justification d'une ligne sur chaque test transforme la suite en documentation des modes de défaillance réels de la fonction, ce qui rapporte à chaque fois que quelqu'un touche ce code plus tard et a besoin de savoir ce qu'il pourrait casser.

Pourquoi « Gaps I Couldn't Cover » est la section la plus précieuse

La plupart des prompts de génération de tests s'arrêtent au code de test. Celui-ci délibérément pas, car un modèle d'IA générant des tests pour une fonction qu'il ne comprend pas entièrement devinera parfois le comportement attendu plutôt que de signaler l'ambiguïté — et une mauvaise estimation intégrée dans un test réussi est pire que pas de test, car elle crée une fausse confiance. L'instruction explicite de signaler l'incertitude avec un commentaire `# VERIFY:`, ainsi qu'une section de sortie dédiée listant les questions non résolues, convertit les suppositions silencieuses en une liste explicite qu'un développeur peut résoudre en deux minutes avant de merge.

Comment l'adapter

Le prompt est framework-agnostic par conception — changez le champ langage/framework et le modèle utilisera pytest, Jest, JUnit, RSpec, ou ce que vous spécifiez, à condition que vous le nommiez explicitement plutôt que de le laisser implicite. Pour du code legacy sans tests existants, fournissez la fonction accompagnée de tous les sites d'appel que vous pouvez trouver, car ceux-ci révèlent souvent des contraintes que la seule signature de la fonction ne montre pas.

testingprompt-engineeringsoftware-developmentunit-testsqa
Partager: