Sua estratégia e seu esqueleto dependem, de maneira não trivial, de quais tipos de testes você deseja gerar, que tipo de cobertura você procura e o idioma / ambiente em que está trabalhando.
É bastante simples escrever um gerador de teste que, para linguagens como C ou Java, leia assinaturas de classe e gere automaticamente testes para casos de canto padrão (passando 0, 2 valores aleatórios, MAX_INT, MIN_INT, para um argumento inteiro, nulos para nulos) , etc ...). Em seguida, você pode executar os testes gerados, registrar os resultados de cada teste e filtrá-los manualmente para remover os irrelevantes, aprovar resultados aceitáveis para testes aprovados (para que eles possam passar automaticamente a partir de então) e marcar como inválidos que falharem. .
Você pode aumentar isso marcando / comentando / refatorando classes para ajudar seu gerador com dicas extras. Você pode ter uma tag que lista todas as exceções possíveis que uma chamada de método pode gerar, ou que fornece um intervalo reduzido de números inteiros válidos para um argumento inteiro. Veja isso como uma abreviação para ter que escrever os testes você mesmo.
Então, aqui estão alguns componentes que você deseja examinar:
- Um componente para analisar automaticamente o código fonte / assinaturas de função / anotações manuais, produzindo casos de teste padrão ou contornos / assinaturas para casos de teste que aguardam a conclusão da entrada.
- Um idioma de tags / anotações / comentários em constante crescimento / alteração, que pode atingir qualquer nível de granularidade (método / classe / assinatura / loops while / etc ...) representando dicas para o construtor de testes automatizado. Idealmente, você deve poder brincar com esse idioma sem precisar recodificar sua estrutura ou qualquer parte dela
- Executor de teste automatizado, com a capacidade de identificar testes novos / antigos e registrar / testar com respostas "aceitáveis" para cada teste. Idealmente, esse corredor criará um banco de dados de execuções de teste, resultados aceitos / recusados e resultados aceitáveis atuais para cada teste.
- "Objeto falsificado" automatizado que, dado um nome de classe e um mapa de nomes-> valores, pode gerar um objeto que imita a classe, retornando dados personalizáveis para chamadas de função, acessadores, slots de dados públicos, etc.
Existem muitas estruturas de teste por aí, que já incluem partes dessa funcionalidade para vários idiomas e plataformas. Embora seja bastante fácil começar a fazer esse trabalho você mesmo e desenvolver esse tipo de estrutura organicamente internamente, também é um projeto interminável de longo prazo que provavelmente duplicará o trabalho existente. Eu recomendo reservar um tempo significativo para analisar o que está disponível primeiro e depois decidir se vale a pena mergulhar.