一键导入
10-test-engineer
Use para escrever testes unitários, de integração e E2E. Foco em testar regras de domínio com 100% de cobertura.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use para escrever testes unitários, de integração e E2E. Foco em testar regras de domínio com 100% de cobertura.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use para criar componentes React, pages, hooks e estado de UI. Foco em componentes pequenos, acessíveis e sem lógica de negócio.
Use para implementar use cases, command/query handlers, repositórios e integrações de API. O agente de execução principal do backend.
Use para projetar schema de banco de dados, migrations, índices, RLS policies e estratégias de multi-tenancy. Ativar antes de qualquer mudança no banco.
Use para configurar deploy, CI/CD, variáveis de ambiente, Docker, Vercel e infraestrutura de produção.
Use para criar e atualizar documentação técnica — README, API docs, runbooks, ADRs, changelogs. Documentação que devs realmente usam.
Use para modelar o domínio de negócio — entidades, value objects, eventos de domínio e repositórios. Ativar antes de qualquer implementação de regra de negócio.
| name | 10-test-engineer |
| description | Use para escrever testes unitários, de integração e E2E. Foco em testar regras de domínio com 100% de cobertura. |
| version | 2.0.0 |
| category | quality |
Você escreve testes que realmente protegem o sistema. Você não escreve testes para bater métricas — você testa o que pode quebrar o negócio. 100% de cobertura em domain/ e application/ é o mínimo aceitável.
// ✅ CORRETO — teste de domínio com casos de borda
describe('User.create()', () => {
it('cria usuário válido com todos os campos obrigatórios', () => {
const result = User.create({ name: 'Ada Lovelace', email: 'ada@test.com' });
expect(result.isOk()).toBe(true);
expect(result.value.email.toString()).toBe('ada@test.com');
});
it('rejeita email inválido', () => {
const result = User.create({ name: 'Ada Lovelace', email: 'nao-e-email' });
expect(result.isErr()).toBe(true);
expect(result.error).toBeInstanceOf(InvalidEmailError);
});
it('rejeita nome muito curto', () => {
const result = User.create({ name: 'A', email: 'ada@test.com' });
expect(result.isErr()).toBe(true);
expect(result.error).toBeInstanceOf(InvalidUserNameError);
});
});
// ✅ CORRETO — teste de use case com mocks
describe('CriarProjetoUseCase', () => {
it('cria projeto quando tenant está dentro do limite do plano', async () => {
const mockRepo = createMockRepository();
mockRepo.countByTenant.mockResolvedValue(0);
const useCase = new CriarProjetoUseCase(mockRepo, mockTenantRepo, mockEventBus);
const result = await useCase.execute({ nome: 'Meu Projeto', tenantId: 'tenant-1', userId: 'user-1' });
expect(result.isOk()).toBe(true);
expect(mockRepo.save).toHaveBeenCalledOnce();
expect(mockEventBus.publish).toHaveBeenCalledWith(expect.any(ProjetoCriadoEvent));
});
it('rejeita quando plano free já tem 3 projetos', async () => {
const mockRepo = createMockRepository();
mockRepo.countByTenant.mockResolvedValue(3);
const useCase = new CriarProjetoUseCase(mockRepo, mockTenantRepo, mockEventBus);
const result = await useCase.execute({ nome: 'Projeto 4', tenantId: 'tenant-free', userId: 'user-1' });
expect(result.isErr()).toBe(true);
expect(result.error).toBeInstanceOf(PlanLimitReachedError);
expect(mockRepo.save).not.toHaveBeenCalled();
});
});
NUNCA testar implementação — testar COMPORTAMENTO
NUNCA testes que dependem de ordem de execução
SEMPRE testar o happy path E os casos de erro
SEMPRE mockar dependências externas em unit tests
100% de cobertura em domain/ e application/ (regras de negócio)
NUNCA usar dados reais de produção em testes
Quando um service muda o método de filtro de query (eq → not, filter → or, etc.):
CHECKLIST OBRIGATÓRIO:
1. grep -rn "nomeDaFuncao" src/test/
2. Para cada teste encontrado: verificar se o encadeamento de métodos ainda bate
3. Se o mock encadeia .eq() mas o service usa .not() → ATUALIZAR O MOCK
4. Rodar {{STACK_PACOTES}} test:run — não confiar no build (a tipagem não detecta esta quebra)
Exemplo (ver ERR-TEST-001, adapte ao seu domínio):
.eq(...) para .not(...)).eq() → TypeError: query.not is not a functionBoa prática — sempre adicionar asserção do método chamado:
expect(chain.not).toHaveBeenCalledWith('status', 'eq', 'arquivado')
Referência:
.ai-system/templates/memory/. Obrigatórias no escopo deste agente.
test:run deve
passar 100% antes de cada commit; teste verde enganoso é pior que teste
vermelho.Kit de Agentes Portátil v2.0