Precisamos de dados de teste ou podemos confiar em testes de unidade e testes manuais?

10

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?

Christian P
fonte

Respostas:

4

Você está misturando dois conceitos diferentes. Uma é a verificação , baseada em testes de unidade e revisões por pares. Isso pode ser feito pelos próprios desenvolvedores, sem dados de teste e sua intenção é verificar se um conjunto de requisitos é atendido.

O segundo é a validação , e isso é feito pelo controle de qualidade (seus testadores). Para esta etapa, você precisa de dados de teste, pois o testador não precisa ter nenhum conhecimento da programação no aplicativo, apenas dos casos de uso pretendidos. Seu objetivo é validar que o aplicativo se comporte como pretendido em um ambiente de produção.

Ambos os processos são importantes e necessários para fornecer um produto de qualidade ao cliente. Você não pode confiar apenas nos testes de unidade. O que você precisa descobrir é uma maneira confiável de manipular seus dados de teste para garantir que sejam válidos.

EDIT: OK, entendi o que você está perguntando. A resposta é sim, porque o trabalho do Testador não é gerar os dados de teste, apenas testar o aplicativo. Você precisa criar seus scripts de uma maneira que facilite a manutenção e garanta a inserção de dados válidos. Sem os dados do teste, o testador não terá nada para testar. Dito isto, no entanto, se você tiver acesso ao ambiente de teste , não vejo por que você não pode inserir os dados de teste manualmente, em vez de usar scripts.

AJC
fonte
Talvez eu tenha afirmado minha pergunta incorretamente mencionando os testes de unidade e os dados de teste. Entendo que a validação não é a mesma que teste de unidade. Meu problema aqui é que os dados de teste que estamos criando com os scripts podem ser criados por meio da interface do usuário em 5 minutos. Para inserir esses dados no aplicativo, você não precisa conhecer a programação, basta seguir os casos de teste.
Christian P
@ christian.p verifique minha atualização sobre o seu esclarecimento da questão.
AJC 10/10
Portanto, sua solução é abandonar os scripts e adicionar dados de teste manualmente através da interface do usuário? E a resposta que P.Brian.Mackey forneceu e suas respostas para combinar os dados com a interface do usuário?
Christian P
@ christian.p Bem, concordo que você deve usar scripts. MAS não há formalidade ou regra que diga que você precisa. O principal motivo para usar scripts para gerar dados simulados é a velocidade (automação) e o acesso (ao ambiente de teste). Se você tiver acesso e for mais rápido e fácil fazê-lo manualmente, não há motivo para não fazê-lo. (MAS mantenha um registro dos dados que você testou).
AJC 10/10
todo testador tem seu próprio ambiente de teste e os testadores estão eliminando completamente o banco de dados várias vezes ao dia, portanto, é impraticável adicionar dados de teste manualmente, mas podemos pedir a eles educadamente que adicionem alguns dados para teste.
Christian P
6

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.

P.Brian.Mackey
fonte
Preciso esclarecer um pouco as coisas: "A simples alteração nos dados de teste produz bugs" - o problema aqui não está no aplicativo - o aplicativo funciona bem quando os dados são válidos (e você não pode adicionar dados inválidos manualmente) . O problema aqui é que dados de teste inválidos podem gerar erros ao tentar trabalhar com esses dados. Então, precisamos testar os dados de teste também?
Christian P
Não tropece em uma falácia de arenque vermelho. O fato de os dados de teste apresentarem um bug é um problema diferente. Remover testes não é uma solução, "governar o governo" também é algo totalmente diferente. O problema é o código. Não é testável porque você está nos dizendo que não pode escrever testes que não quebram as coisas. É por isso que você precisa melhorar o código.
usar o seguinte
Talvez você tenha entendido mal a minha pergunta. Temos testes de unidade em funcionamento e todas as novas funcionalidades que escrevemos têm testes de unidade. Não estou sugerindo que removamos testes que não estão passando ou que não escrevemos testes. Só estou sugerindo que não utilizemos os scripts para criar dados simulados no banco de dados, porque os testadores manuais estão fazendo a mesma coisa.
Christian P
"Realmente não vejo o objetivo de manter os dados de teste nos scripts" <- É o que estou dizendo sobre o suporte ao teste. Não exclusão de testes antigos. É uma má idéia. Você está diminuindo a reprodutibilidade e se acoplando a uma interface do usuário que faz parte do que você está tentando testar e pode se adaptar às mudanças. Desacoplar-se da interface do usuário. Mantenha a automação de dados.
usar o seguinte
Mas como lidamos com o problema de dados simulados inválidos? Se continuarmos a criar dados simulados para o banco de dados, como verificamos se os dados simulados estão ok ou não? Se a regra de negócios exigir esse valor X = 2 e o banco de dados aceitar X = 100 - como verificar a integridade dos dados de teste quando a regra de negócios for complexa?
Christian P
1

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.

Otavio Macedo
fonte