Bancos de dados e o servidor de IC


8

Eu tenho um servidor de CI (Hudson) que cria alegremente, executa testes de unidade e implanta no ambiente de desenvolvimento, mas agora gostaria de executá-lo nos testes de integração.

Os testes de integração atingirão um banco de dados e esse banco de dados será constantemente alterado para conter os dados relevantes para o teste em questão. No entanto, isso leva a um problema - como garantir que o banco de dados não esteja sendo preenchido com dados para um teste e que esses dados sejam substituídos por um segundo projeto antes da conclusão do primeiro conjunto de testes?

Atualmente, estou usando o método "esperança", que não está funcionando muito mal no momento, mas principalmente devido ao fato de termos apenas um pequeno número de testes de integração configurados no IC.

A meu ver, tenho as seguintes opções:

  • Bancos de dados locais de teste (na memória)
    Não tenho certeza se algum banco de dados na memória lida com todos os aspectos assustadores dos gatilhos e pacotes do Oracles, etc.
  • Bancos de dados locais do executor de IC
    Seria necessário um bom trabalho para configurá-lo e mantê-lo atualizado, mas uma opção desafiadora (a maior parte do trabalho já foi feita para manter o banco de dados de CI atual atualizado).
  • Executor único de "teste de integração"
    Provavelmente o mais fácil de implementar, mas significaria que os testes de integração poderiam ficar muito para trás.
  • Bloqueando o banco de dados (ou conjunto de tabelas)

Tenho certeza de que perdi algumas maneiras (adicione-as). Como você executa testes de integração baseados em banco de dados no servidor de IC? Quais problemas você teve e qual método você recomenda? (Observação: enquanto eu uso o Hudson, fico feliz em aceitar respostas para qualquer servidor de IC, as idéias, com certeza, serão portáteis, mesmo que os detalhes não sejam).

Cheers,
     Mlk


1
Esta questão de stackoverflow pode ser útil para você.
Michael K

Respostas:


1

Apenas uma ideia, já que eu nunca fiz isso, mas você pode configurar uma tarefa para obter o DDL para o esquema do banco de dados contra o qual está testando e recriá-lo na memória ou em outro banco de dados. Parece que é bastante simples no Oracle. Em seguida, você pode gerar automaticamente o novo banco de dados sempre que ele for alterado.

Parece que a Oracle tem um banco de dados em memória chamado TimesTen . Pode valer a pena olhar. Eu preferiria definitivamente usar um banco de dados na memória, se possível, pois geralmente é mais rápido que o armazenamento rígido.


Tentei dbs na memória alguns anos atrás, mas achei que era muito mais lento do que usar um banco de dados real (estou feliz em tentar novamente). O banco de dados real existe com o esquema (mas sem conteúdo). A memória precisa ser iniciada e ter o esquema criado para cada teste / execução de teste. Vou tentar o TimeTen e ver se consigo vinculá-lo ao nosso sistema de clonagem de banco de dados e atualização de esquema existente.
Mlk

Talvez você possa criar um singleton que contenha a referência ao banco de dados e apenas limpar as tabelas após cada teste? Acho que minha experiência não foi com conjuntos de dados grandes o suficiente.
Michael K

Usaram o Apache Derby para isso, ele funciona.
Tim Williscroft

1

Executamos testes de integração baseados em banco de dados, levantando um servidor de banco de dados para trabalhar com a caixa de IC e hospedar a instância de IC. Como o armazenamento temporário e a produção cada um tem seu próprio servidor de banco de dados.


Como você lida com projetos de testes de multiplicação que atingem o mesmo banco de dados ao mesmo tempo ou você possui um banco de dados por executor?
Mlk

2
Todo mundo obtém seu próprio banco de dados (ou bancos de dados, conforme necessário) em termos do servidor SQL, sem ter certeza de como isso se traduz no Oracle-land.
Wyatt Barnett

Supondo que estou lendo isso corretamente, cada executor de IC obtém seu próprio banco de dados? Como você reconfigura o app.config (/ no entanto, a configuração do banco de dados é feita) para cada executor?
Mlk

1
Novamente, não tenho certeza se estou entendendo sua terminologia aqui, mas para o CI, configuramos a caixa com as mesmas convenções que usamos na equipe de desenvolvimento para que as coisas se encaixem no lugar - por exemplo, todo mundo está usando o banco de dados chamado "foo" no servidor sql localhost \ SQLEXPRESS, para que funcione.
Wyatt Barnett

Ah, então você executa o banco de dados localmente ou o SQLEXPRESS é um banco de dados na memória? Se for local, isso limita você a um único executor por instância de IC.
mlk
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.