No momento, estamos trabalhando em um projeto PHP / MySQL de médio / grande porte. Estamos fazendo testes de unidade com PHPUnit e QUnit e temos dois testadores em tempo integral que estão testando manualmente o aplicativo. Atualmente, nossos dados de teste (simulados) são criados com scripts SQL.
Temos problemas com a manutenção de scripts para dados de teste. A lógica de negócios é bastante complexa e uma alteração "simples" nos dados de teste geralmente produz vários bugs no aplicativo (que não são bugs reais, apenas o produto de dados inválidos). Isso se tornou um grande fardo para toda a equipe, porque estamos constantemente criando e alterando tabelas.
Realmente não vejo o objetivo de manter os dados de teste nos scripts, porque tudo pode ser adicionado manualmente no aplicativo em cerca de 5 minutos com a interface do usuário. Nosso PM discorda e diz que ter um projeto que não podemos implantar com dados de teste é uma prática ruim.
Devemos abandonar a manutenção dos scripts com dados de teste e deixar os testadores testarem o aplicativo sem dados? Qual é a melhor prática?
fonte
Sim, ter testes de unidade e modelos de dados é uma prática recomendada. O gerente do projeto está correto. Como executar uma alteração "simples" nos dados de teste geralmente produz bugs, esse é o núcleo do problema.
O código precisa ser aprimorado. Não fazer isso (dizer: ei, não precisamos de testes) não é uma correção, é simplesmente adicionar dívida técnica . Divida o código em unidades menores e mais capazes de testar, porque não é possível identificar as unidades sem quebra é um problema.
Comece a fazer um refator. Mantenha as melhorias pequenas para que sejam gerenciáveis. Procure anti-padrões como classes / métodos de Deus, não seguindo DRY, responsabilidade única, etc ...
Por fim, examine o TDD para ver se funciona para a equipe. O TDD funciona bem para garantir que todo o seu código possa ser testado (porque você escreve os testes primeiro) e também para manter-se enxuto escrevendo apenas o suficiente para passar nos testes (minimizar a engenharia).
Em geral, se uma série de processos complexos de lógica de negócios produzem um conjunto de dados, eu vejo isso como um relatório. Encapsule o relatório. Execute o relatório e use o objeto resultante como entrada para o próximo teste.
fonte
Este é um problema muito comum e muito difícil também. Testes automatizados executados em um banco de dados (mesmo em um banco de dados na memória, como HSQLDB ) geralmente são lentos, não determinísticos e, como uma falha no teste indica apenas que há um problema em algum lugar no seu código ou nos seus dados, eles são não é muito informativo.
Na minha experiência, a melhor estratégia é focar em testes de unidade para lógica de negócios. Tente cobrir o máximo possível do seu código de domínio principal. Se você acertar esta parte, o que já é um grande desafio, você obterá a melhor relação custo-benefício para testes automatizados. Quanto à camada de persistência, normalmente invisto muito menos esforço em testes automatizados e deixo para testadores manuais dedicados.
Mas se você realmente deseja (ou precisa) automatizar testes de persistência, recomendo que você leia Growing Software Orientado a Objetos, Guiado por Testes . Este livro possui um capítulo inteiro dedicado aos testes de persistência.
fonte