Criador: Richard Bradshaw
A heurística TRIMS é um modelo criado por Richard Bradshaw e sua equipe para ajudar a avaliar, criar e reestruturar checks automatizados de forma mais eficaz. O nome vem da ideia de "aparar" (trimming) testes desnecessários para focar no que realmente agrega valor.
- Targeted (Direcionado)
- Reliable (Confiável)
- Informative (Informativo)
- Maintainable (Manutenível)
- Speedy (Rápido)
Objetivo: Direcionar testes para riscos específicos na camada mais baixa possível.
Como aplicar:
- Identifique o risco específico que você quer mitigar
- Escolha a camada mais baixa onde é possível testar esse risco
- Evite testar na UI quando o risco está na API ou no nível unitário
Exemplo prático:
❌ Testar validação de email na UI
✅ Testar validação de email no nível unitário
Objetivo: Criar testes determinísticos que executam consistentemente.
Como aplicar:
- Elimine dependências externas instáveis
- Use dados de teste controlados
- Implemente esperas explícitas ao invés de timeouts fixos
- Monitore e corrija testes "flaky"
Exemplo prático:
// ❌ Teste não confiável
await page.waitForTimeout(3000);
// ✅ Teste confiável
await page.waitForSelector('#result', { state: 'visible' });Objetivo: Fornecer informações úteis tanto em falhas quanto em sucessos.
Como aplicar:
- Inclua capturas de tela em falhas
- Grave vídeos de execução
- Adicione logs detalhados
- Implemente relatórios claros
Exemplo prático:
// ✅ Teste informativo
test('login should work', async ({ page }) => {
await page.screenshot({ path: 'before-login.png' });
try {
await page.fill('#email', 'user@test.com');
await page.fill('#password', 'password123');
await page.click('#login-btn');
await expect(page.locator('#dashboard')).toBeVisible();
} catch (error) {
await page.screenshot({ path: 'login-failure.png' });
throw error;
}
});Objetivo: Facilitar a manutenção e atualização dos testes.
Como aplicar:
- Use Page Object Model ou padrões similares
- Evite duplicação de código
- Mantenha testes simples e legíveis
- Documente casos complexos
Exemplo prático:
// ✅ Código manutenível
class LoginPage {
constructor(page) {
this.page = page;
this.emailInput = '#email';
this.passwordInput = '#password';
this.loginButton = '#login-btn';
}
async login(email, password) {
await this.page.fill(this.emailInput, email);
await this.page.fill(this.passwordInput, password);
await this.page.click(this.loginButton);
}
}Objetivo: Otimizar tanto a execução quanto a manutenção dos testes.
Como aplicar:
- Execute testes em paralelo quando possível
- Use dados de teste pré-criados
- Implemente feedback rápido em pipelines
- Otimize seletores e esperas
Exemplo prático:
// ✅ Execução rápida
test.describe.configure({ mode: 'parallel' });
test('fast API test', async ({ request }) => {
const response = await request.get('/api/users');
expect(response.status()).toBe(200);
});- Revise todos os testes existentes
- Avalie cada teste contra os critérios TRIMS
- Identifique testes que não atendem aos critérios
- Delete: Remova testes desnecessários ou duplicados
- Refactor: Melhore testes que podem ser salvos
- Relocate: Mova testes para camadas mais apropriadas
Richard Bradshaw reduziu seus testes de 2.500 checks para:
- 400 checks na UI
- 500 checks na API
- Redução de testes desnecessários
- Feedback mais rápido e confiável
- Menor custo de manutenção
- Maior confiança na automação
- Melhor direcionamento de esforços
"Este teste está direcionado ao risco certo, é confiável, informativo, manutenível e rápido?"
Se a resposta for "não" para qualquer critério, considere refatorar ou remover o teste.