Pergunta

Alguém tem boas dicas para escrever código de teste para desenvolvimento de back-end de banco de dados onde há uma forte dependência de estado?

Especificamente, quero escrever testes para código que recupera registros do banco de dados, mas as respostas dependerão dos dados do banco de dados (que podem mudar com o tempo).

As pessoas geralmente criam um sistema de desenvolvimento separado com um banco de dados 'congelado' para que qualquer função sempre retorne exatamente o mesmo conjunto de resultados?

Tenho certeza de que esta não é uma questão nova, por isso estaria muito interessado em aprender com a experiência de outras pessoas.

Existem bons artigos por aí que discutem esta questão do desenvolvimento baseado na web em geral?

Normalmente escrevo código PHP, mas espero que todos esses problemas sejam em grande parte independentes de linguagem e estrutura.

Foi útil?

Solução

Você deve procurar no DBUnit ou tentar encontrar um equivalente em PHP (deve haver um por aí).Você pode usá-lo para preparar o banco de dados com um conjunto específico de dados que representa seus dados de teste e, assim, cada teste não dependerá mais do banco de dados e de algum estado existente.Dessa forma, cada teste é independente e não será interrompido durante o uso posterior do banco de dados.

Atualizar:Uma rápida pesquisa no Google mostrou um Extensão da unidade de banco de dados para PHPUnit.

Outras dicas

Se você está mais preocupado com testes de camada de dados, talvez queira dar uma olhada neste livro: Padrões de teste xUnit:Refatorando código de teste.Eu sempre tive dúvidas sobre isso, mas este livro faz um ótimo trabalho para ajudar a enumerar preocupações como desempenho, reprodutibilidade, etc.

Acho que depende do banco de dados que você está usando, mas a Red Gate (www.red-gate.com) cria uma ferramenta chamada SQL Data Generator.Isso pode ser configurado para preencher seu banco de dados com dados de teste de aparência sensata.Você também pode dizer para ele sempre usar a mesma semente em seu gerador de números aleatórios, para que seus dados 'aleatórios' sejam sempre os mesmos.

Você pode então escrever seus testes de unidade para usar esses dados confiáveis ​​e repetíveis.

Quanto a testar o lado web, atualmente estou pesquisando o Selenium (selenium.openqa.org).Este parece ser um conjunto de testes compatível com vários navegadores que o ajudará a testar a funcionalidade.No entanto, como acontece com todas essas ferramentas de teste de sites, não há uma maneira real de testar quão bem essas coisas olhar em todos os navegadores sem lançar um olhar humano sobre eles!

Usamos um banco de dados na memória (hsql: http://hsqldb.org/).Hibernar (http://www.hibernate.org/) torna mais fácil apontar nossos testes de unidade para o banco de dados de teste, com a vantagem adicional de que eles são executados tão rápido quanto um raio.

Tenho exatamente o mesmo problema com meu trabalho e acho que a melhor ideia é ter um script PHP para recriar o banco de dados e, em seguida, um script separado onde jogo dados malucos nele para ver se ele o quebra.

Eu nunca usei nenhum teste de unidade ou algo semelhante, então não posso dizer se funciona ou não, desculpe.

Se você puder configurar o banco de dados com uma quantidade conhecida antes de executar os testes e desmontá-lo no final, saberá com quais dados está trabalhando.

Então você pode usar algo como Selenium para testar facilmente a partir de sua UI (assumindo que seja baseado na Web aqui, mas existem muitas ferramentas de teste de UI para outros sabores de UI) e detectar a presença de certos registros retirados do banco de dados.

Definitivamente, vale a pena configurar uma versão de teste do banco de dados - ou fazer com que seus scripts de teste preencham o banco de dados com dados conhecidos como parte dos testes.

Você poderia tentar http://selenium.openqa.org/ é mais para testes de GUI do que para um aplicativo de teste de camada de dados, mas registra suas ações que podem ser reproduzidas para automatizar testes em diferentes plataformas.

Aqui está minha estratégia (eu uso JUnit, mas tenho certeza que existe uma maneira de fazer o equivalente em PHP):

Eu tenho um método que é executado antes de todos os testes unitários para uma classe DAO específica.Ele coloca o banco de dados de desenvolvimento em um estado conhecido (adiciona todos os dados de teste, etc.).À medida que executo testes, acompanho todos os dados adicionados ao estado conhecido.Esses dados são limpos no final de cada teste.Após a execução de todos os testes da classe, outro método remove todos os dados de teste do banco de dados dev, deixando-o no estado em que estava antes da execução dos testes.É um pouco trabalhoso fazer tudo isso, mas normalmente escrevo os métodos em uma classe DBTestCommon onde todas as minhas classes de teste DAO podem acessá-los.

Eu proporia usar três bancos de dados.Um banco de dados de produção, um banco de dados de desenvolvimento (preenchido com alguns dados significativos para cada desenvolvedor) e um banco de dados de teste (com tabelas vazias e talvez algumas linhas que são sempre necessárias).

Uma maneira de testar o código do banco de dados é:

  1. Insira algumas linhas (usando SQL) para inicializar o estado
  2. Execute a função que você deseja testar
  3. Compare os resultados esperados com os reais.Aqui você poderia usar sua estrutura normal de teste de unidade
  4. Limpe as linhas que foram alteradas (para que a próxima execução não veja a execução anterior)

A limpeza poderia ser feita de maneira padrão (é claro, apenas no banco de dados de teste) com DELETE * FROM table.

Em geral concordo com Peter, mas para criar e excluir dados de teste eu não usaria SQL diretamente.Prefiro usar alguma API CRUD usada no produto para criar dados o mais semelhantes possível à produção...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top