Configuração e Tear Down de banco de dados complexos Estado com Hibernate / Primavera / JUnit

StackOverflow https://stackoverflow.com/questions/822846

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho uma classe que eu sou o teste de unidade que requer bastante extensa configuração de banco de dados antes que os métodos de ensaio individuais podem executar. Esta configuração leva muito tempo:. Por razões espero que não relevantes para a questão em apreço, eu preciso preencher o DB programaticamente em vez da partir de um despejo SQL

O problema que tenho é com a lágrima-down. Como eu posso facilmente reverter todas as alterações feitas na fase de instalação db?

Atualmente estou usando o suporte Hibernate + Primavera Transactional Testes, de tal forma que os meus métodos de ensaio individuais são envolvidos nas transações.

Uma solução seria fazer a configuração db dentro de cada método de teste, de modo que a configuração db seria revertida automaticamente. No entanto, os métodos de ensaio iria demorar uma eternidade para executar uma vez que cada método seria necessário voltar a preparar o banco de dados.

Quaisquer outras ideias? Basicamente, eu estou procurando uma maneira de executar a minha configuração db, executar meus testes individuais (cada um envolto em uma transação que fica enrolado à volta após a execução), e, em seguida, roll-back a configuração inicial db. Alguma idéia de fazer este trabalho de forma Hibernate / Primavera / JUnit? Existe uma Hibernate "apague todas as tabelas" comando equivalente?

Foi útil?

Solução

Você está preso com um fornecedor de banco de dados específico? Se não, você poderia usar um banco de dados in-memory, como HSQLDB . Quando você é feito com os testes que você simplesmente jogar fora do estado. Isso só é apropriado se as tabelas pode ser vazia no início do conjunto de teste (antes de sua instalação programática, que é).

Você ainda precisa criar tabelas, mas se tudo está bem mapeada usando Hibernate você pode usar o hbm2ddl para gerar suas tabelas. Tudo que você tem a fazer é adicionar a seguinte à sua test definição fábrica de sessão:

<session-factory>
    ...
    <property name="hibernate.hbm2ddl.auto">create</property>
    ...
</session-factory>

Se esta solução parece aplicável posso elaborar sobre isso.

Outras dicas

Você pode querer olhar para @AfterClass anotação, para JUnit 4. Esta anotação será executado quando os testes são feitos.

http://cwiki.apache.org/DIRxDEV/junit4-primer.html

DNUnit deve ajudá-lo a este respeito. Você pode criar conjuntos de dados separados para cada caso de teste individual, se desejar.

DBUnit vai ajudar muito com isso. Você poderia, teoricamente, desligue autocommits em JDBC, mas vai se complicar. A solução mais óbvia é usar DBUnit para definir os seus dados para um estado conhecido antes de executar os testes. Se por algum motivo você precisa de sua volta dados após os testes são executados, você pode olhar para @AfterClass em uma suite que executa todos os testes, mas é geralmente considerado uma melhor prática para configurar os testes e, em seguida, executá-los, de modo que, se o teste falhar, não é só porque ele não tinha um ambiente prestine devido a uma falha para limpar um teste diferente. Você garantir que cada conjuntos de teste até seu ambiente diretamente.

Uma solução que você pode querer considerar é usar um rollback "manual" ou compensar transação no db para baixo lágrima. Suponho que (e se não é, então ele deve ser um add-on para suas entidades Hibernate trivial) todas as suas entidades têm datetime criar atributo indicando quando foram inseridas na tabela. O método de configuração db deve registrar tempo antes de tudo o resto. Então você tem procedimento bastante simples para db lágrima para baixo para excluir todas as entidades que foram criadas após o tempo recored no db setup.

Claro, isso não vai funcionar para atualizações na configuração db ... Mas se você tem número limitado de atualizações, em seguida, considerar a economia imagem intocada para este tipo de dados e restaurá-lo durante db lágrima para baixo.

Se você está trabalhando com relativamente pequeno banco de dados, e com um SGBD que pode fazer backups / exportações de relativamente rápidos (como MS SQL Server), você pode considerar a criação de um backup de banco de dados antes dos testes, e depois restaurá-lo quando todos os testes está completo. Isso permite que você set-up um desenvolvimento / banco de dados de teste e usá-lo como um estado inicial para todos os seus testes.

Eu fiz isso com JDBC nativo, executando '' banco de dados de backup '' e '' restaurar a base de dados '' T-SQL no meio testes, e funcionou razoavelmente bem.

No entanto, esta abordagem é dependente de ter o servidor DBMS em sua máquina local (para velocidade razoável), você tem privilégios suficientes (que do que não deve ser um problema), e o tamanho total do banco de dados não superior a algumas dezenas de MB -. pelo menos na minha experiência

Existe uma razão que você tem que ter uma conexão com o banco de dados para executar os testes de unidade? Parece que pode ser mais fácil refatorar sua classe de modo que você pode zombar a interação com o banco de dados. Você pode zombar classes (com algumas exceções), bem como as interfaces com EasyMock (www.easymock.org).

Se a classe se baseia em um estado complexo pré-existente em um banco de dados conectado, provavelmente seria mais fácil de escrever mais rápido executar testes usando simulações. Não sabemos o que o tamanho do seu projeto é ou quantas vezes os seus testes são executados, mas o tempo de execução pode ser algo para se pensar, especialmente em um grande projeto.

O Hibernate tem um pouco característica pura que é fortemente sub-documentado e desconhecido. Você pode executar um script SQL durante o direito criação SessionFactory após a geração de esquema de banco de dados para importar dados em um banco de dados fresco. Você só precisa adicionar um arquivo chamado Import.sql na raiz do seu classpath e conjunto de criar ou criar-drop como sua propriedade hibernate.hbm2ddl.auto.

http://in.relation.to/Bloggers/RotterdamJBugAndHibernatesImportsql

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