@test-generatorLe rédacteur de tests — AAA pattern, edges + errors
Maifady est un plugin Claude Code 100% gratuit avec 30 agents IA — @test-generator écrit les tests unitaires que tu n'as pas envie d'écrire. Il détecte ton framework (Jest, Vitest, pytest, PHPUnit, Go testing, JUnit), suit le pattern AAA (Arrange / Act / Assert) et couvre happy path + edges + errors — sans test bidon "no exception thrown".
Le problème qu'il résout
Tu viens d'écrire calculatePrice(items, discount). Elle marche sur ton happy path. Mais tu sais qu'il y a des edge cases — panier vide, discount négatif, items à quantité 0, items à prix négatif — et tu n'as pas envie d'écrire 12 tests à la main, surtout que tu vas oublier la moitié.
@test-generator les écrit pour toi, avec assertions concrètes (pas "ne plante pas").
Comment il bosse
- Tu lui pointes la fonction / classe à tester.
- Il détecte le framework via les manifests et les tests existants.
- Pour chaque fonction, il couvre : happy path, boundary (empty, 0, 1, max, min), errors (invalid input, null, network/DB fail), side effects, async (timeout, rejection).
- Il suit AAA : arrange, act, assert — un assert par test quand possible.
- Il mock les dépendances externes (HTTP, DB, fs).
Exemple concret
Tu tapes
›@test-generator tests pour calculatePrice() dans src/pricing.ts. Couvre : happy, panier vide, discount négatif, discount > 100%, items prix négatif, quantity = 0.
Tu obtiens
describe('calculatePrice', () => {
test('returns 0 for empty cart', () => {
expect(calculatePrice([], 0)).toBe(0);
});
test('applies percentage discount correctly', () => {
const items = [{ price: 100, quantity: 2 }];
expect(calculatePrice(items, 10)).toBe(180);
});
test('throws on negative discount', () => {
expect(() => calculatePrice([], -5)).toThrow('discount must be >= 0');
});
test('throws when discount > 100', () => {
expect(() => calculatePrice([], 150)).toThrow();
});
test('skips items with quantity 0', () => {
const items = [
{ price: 100, quantity: 0 },
{ price: 50, quantity: 1 }
];
expect(calculatePrice(items, 0)).toBe(50);
});
// ... 7 autres
});
Pourquoi tu vas l'aimer
Edge cases couverts
Vide, 0, 1, max, min, négatif, null, async timeout — toujours. Pas que le happy path.
Pas de test bidon
Aucun "expect().not.toThrow()" sans vraie assertion. Chaque test vérifie un outcome concret.
Type-aware
Si tu donnes les types TypeScript, il génère des tests qui matchent. Pas de "as any".
Mirroirs ton style
Il échantillonne tes tests existants pour suivre tes conventions (naming, helpers, fixtures).
Quand l'utiliser
✅ Idéal pour
- Fonctions / classes que tu viens d'écrire
- Code legacy sans tests, avant de refactorer
- Augmenter la coverage sur des modules critiques
- Tests de régression après un bug fix
⚠️ Pas adapté quand
- Tests E2E de user journey → @e2e-test-writer
- Tu veux savoir où la coverage manque → @coverage-improver
- Tests d'intégration multi-services — l'agent reste sur l'unitaire
Combine avec ces agents
Questions fréquentes
Quels frameworks détecte-t-il ?
JS/TS : Jest, Vitest, Mocha, Node test runner. Python : pytest, unittest. Go : built-in testing. Java : JUnit 5. PHP : PHPUnit, Pest. Rust : built-in #[test].
Couvre-t-il les edge cases ?
Oui : vide, 0, 1, max, min, négatif, null/undefined, wrong type, async timeout, async rejection. Toujours.
Mock-t-il les dépendances ?
Oui : HTTP (fetch, axios), DB (ORM), fs. Pas de tests qui hit le réseau ou la DB en unitaire.