Estou codificando testes em c # e resolvi com essa estrutura:
try
{
// ==========
// ARRANGE
// ==========
// Insert into the database all test data I'll need during the test
// ==========
// ACT
// ==========
// Do what needs to be tested
// ==========
// ASSERT
// ==========
// Check for correct behavior
}
finally
{
// ==========
// CLEANUP
// ==========
// Inverse of ARRANGE, delete the test data inserted during this test
}
O conceito era "todo teste limpa a bagunça que faz". No entanto, alguns testes estão deixando o banco de dados sujo e com falha nos testes que se seguem.
Qual é o caminho certo para fazer isso? (minimizar erros, minimizar o tempo de execução)
- Deletes everything» Insert defaults» Insert test data»Executar teste?
Insert defaults» Insert test data» Executar teste » Delete everything?
Atualmente :
- (por sessão) Deletes everything»Insert defaults
- (por teste) Insert test data»Executar teste»Delete test data
O grande problema com bancos de dados e testes (unitários) é que os bancos de dados são muito bons em coisas persistentes.
A solução usual é não usar um banco de dados real em seus testes de unidade, mas sim zombar do banco de dados ou usar um banco de dados na memória que possa ser facilmente apagado completamente entre os testes.
Somente ao testar o código que interage diretamente com o banco de dados ou nos testes de ponta a ponta, o banco de dados real será usado.
fonte
Trabalhando em um servidor C # com SQL Server e PetaPoco , essa é a abordagem que adotamos para limpar dados em testes de unidade.
Um teste de unidade típico teria Setup e Teardown da seguinte maneira:
Onde PlatformDataObject é uma classe responsável pela comunicação com o banco de dados, por exemplo, executando Select Insert Update Deletes. Todos os tipos * DataObject herdam ServerDataObject - a classe base possui métodos para interromper, reverter ou confirmar a transação.
Todos os testes de unidade chamariam RollbackTransaction () e, finalmente, chamariam IDbTransaction.Rollback ().
Nos testes, achamos rotineiro criar uma nova instância de um * DataObject, criar algumas linhas usando instruções Insert, executar testes nelas (Selects, Updates etc ...) e depois reverter.
Podemos configurar um conjunto de dados de teste antes de todos os testes serem executados usando um SetUpFixture - uma classe executada uma vez antes de todos os testes serem executados e excluir / reverter os dados em desmontagem após a execução de todos os testes.
fonte