🧪 Testing

@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".

Télécharger MaifadyVoir les 30 agents

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

  1. Tu lui pointes la fonction / classe à tester.
  2. Il détecte le framework via les manifests et les tests existants.
  3. 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).
  4. Il suit AAA : arrange, act, assert — un assert par test quand possible.
  5. 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.

Prêt à tester sans flemme ?

Télécharger Maifady