Test Code Generator

Gera código de teste Vitest a partir de especificações JSON usando análise de valor limite e particionamento de equivalência.

Documentação

Servidor MCP Test Code Generator

Um servidor MCP que gera código de teste Vitest com base em análise de valor limite e particionamento de equivalência a partir de especificações JSON.

Recursos

  • Análise de Valor Limite: Gera automaticamente valores limite e seus valores adjacentes para intervalos contínuos
  • Suporte a Múltiplos Intervalos: Lida com intervalos válidos descontínuos (ex.: 0-10, 20-30, 40-50)
  • Particionamento de Equivalência: Inclui todos os valores válidos e inválidos de dados categóricos
  • Teste de Pares: Gera combinações de teste eficientes usando o método de pares
  • Formato Vitest: Gera código de teste limpo usando o padrão test.each
  • Guia de Especificação: Fornece prompts para ajudar a criar especificações JSON
  • Otimizado para Linguagem: Todo o processamento e saída em inglês para desempenho ideal do LLM

Início Rápido

Usando npx (sem instalação necessária)

# Run directly with npx
npx testing-mcp-vitest

# Configure Claude Desktop as shown below

Consulte QUICKSTART.md para instruções detalhadas de configuração.

Instalação

Usando npx (Recomendado)

npx testing-mcp-vitest

Instalação Local

# Clone repository
git clone <repository-url>
cd test-code-generator-mcp

# Install dependencies
npm install

# Build
npm run build

Uso

Configuração do Claude Desktop

Adicione ao seu claude_desktop_config.json:

{
  "mcpServers": {
    "test-generator": {
      "command": "npx",
      "args": ["testing-mcp-vitest"]
    }
  }
}

Locais dos arquivos de configuração:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Ferramentas Disponíveis

1. generate-test-code

Gera código de teste a partir de especificação JSON.

2. Prompts

  • create-test-spec: Explica como criar especificações de teste
  • boundary-value-example: Fornece exemplos de análise de valor limite
  • equivalence-class-example: Fornece exemplos de particionamento de equivalência

Formato da Especificação

Estrutura básica com intervalo único:

{
  "type": "model",
  "name": "UserRegistration",
  "columns": [
    {
      "name": "age",
      "type": "number",
      "valueType": "continues",
      "values": {
        "min": 18,
        "max": 120
      }
    },
    {
      "name": "userType",
      "type": "string",
      "valueType": "category",
      "values": {
        "valid": ["admin", "user", "guest"],
        "invalid": ["superuser", "root", ""]
      }
    }
  ]
}

Exemplo com múltiplos intervalos:

{
  "name": "workHours",
  "type": "number",
  "valueType": "continues",
  "values": {
    "ranges": [
      { "min": 9, "max": 12 },   // Morning shift
      { "min": 14, "max": 18 }   // Afternoon shift
    ]
  }
}

Exemplo de Código de Teste Gerado

import { describe, test, expect } from 'vitest';

describe('Tests for UserRegistration', () => {
  // Valid cases
  test.each([
    { inputs: { age: 18, userType: "admin" }, description: 'Combination 1: Valid case' },
    { inputs: { age: 69, userType: "user" }, description: 'Combination 2: Valid case' },
    { inputs: { age: 120, userType: "guest" }, description: 'Combination 3: Valid case' },
    // ... more test cases
  ])('Valid case: $description', ({ inputs }) => {
    // TODO: Import the function or model to test
    // import { UserRegistration } from './path/to/UserRegistration';

    // TODO: Execute the test subject
    // const result = UserRegistration(inputs);

    // TODO: Check expected values
    // expect(result).toBeDefined();
    // expect(result.error).toBeUndefined();
  });

  // Invalid cases
  test.each([
    { inputs: { age: 17, userType: "admin" }, description: 'Combination 4: Invalid case' },
    { inputs: { age: 121, userType: "user" }, description: 'Combination 5: Invalid case' },
    { inputs: { age: 50, userType: "superuser" }, description: 'Combination 6: Invalid case' },
    { inputs: { age: 50, userType: "root" }, description: 'Combination 7: Invalid case' },
    { inputs: { age: 50, userType: "" }, description: 'Combination 8: Invalid case' },
    // ... more test cases
  ])('Invalid case: $description', ({ inputs }) => {
    // TODO: Import the function or model to test
    // import { UserRegistration } from './path/to/UserRegistration';

    // TODO: Verify that an error occurs
    // expect(() => UserRegistration(inputs)).toThrow();
    // or
    // const result = UserRegistration(inputs);
    // expect(result.error).toBeDefined();
  });
});

Principais Recursos

Cobertura Completa

  • Todos os valores de classe de equivalência válidos e inválidos são incluídos nos casos de teste
  • Os valores limite incluem: min-1, min, min+1, meio, max-1, max, max+1
  • Para múltiplos intervalos, inclui valores de lacuna entre os intervalos

Combinações Eficientes

  • 3 ou menos parâmetros: gera todas as combinações
  • 4 ou mais parâmetros: usa o método de pares para eficiência

Suporte a Múltiplos Intervalos

Útil para:

  • Horários de trabalho (9-12, 14-18)
  • Pontuações válidas (0-40 aprovação, 60-100 honras)
  • Faixas de temperatura (diferentes faixas válidas para diferentes condições)
  • Slots de tempo (sessões da manhã, tarde, noite)

Exemplos

Consulte o diretório examples/ para mais exemplos de especificação:

  • user-registration.json - Validação básica de modelo
  • calculate-discount.json - Lógica de negócios com múltiplos parâmetros
  • multi-range-validation.json - Agendamento complexo com múltiplos intervalos
  • japanese-postal-code.json - Padrões de validação regional

Desenvolvimento

# Development mode
npm run dev

# Build
npm run build

# Production mode
npm start

# Debug mode
DEBUG=1 npm start

Publicação no npm

# Build and publish
npm publish

Contribuindo

  1. Faça um fork do repositório
  2. Crie sua branch de recurso (git checkout -b feature/amazing-feature)
  3. Faça commit das suas alterações (git commit -m 'Add some amazing feature')
  4. Envie para a branch (git push origin feature/amazing-feature)
  5. Abra um Pull Request

Licença

MIT - consulte LICENSE para detalhes

Suporte

  • Issues do GitHub: [Relate bugs ou solicite recursos](/issues)
  • Discussões: [Faça perguntas ou compartilhe ideias](/discussions)