Pergunta

Eu queria saber o que se aproxima de outros podem ter para testar os serviços de domínio contra um banco de dados? Eu já tenho uma série de repositórios de simulação que eu sou capaz de usar nos serviços de domínio para testar os serviços de domínio próprios. Parte da construção destes repositórios de simulação é que eles construir agregados da amostra e entidades associadas e validá-los contra as mesmas regras de negócios que seriam usados ??no modelo. Isso também proporciona uma agradável e simples meio para detectar pontos de impacto em potencial dentro das entidades-se, no caso em que suas interfaces mudança.

O principal problema que eu vejo com os testes ao vivo dos meus repositórios lastreados em SQL é a consistência do banco de dados. Por exemplo, uma vez que um teste é executado a "criar" aspectos já foram executados. Executá-los novamente, obviamente, causar falhas, como o banco de dados não é mais intocada. Eu estava pensando em criar um banco de dados espelhado usado apenas para este tipo de teste. Seria mínimo, contendo estrutura, de programação, os constrangimentos, etc. gostaria também fornecer um conjunto mínimo de dados para certos testes estabelecidos. Minha linha de pensamento é que eu poderia ter um procedimento armazenado que eu poderia chamar para redefinir o banco de dados para o estado "primitivo" com os dados de base antes do início da execução do teste.

Enquanto isso não é tão importante em uma máquina do desenvolvedor após a funcionalidade foi inicialmente verificada, eu estou olhando mais para a importância de executar esses testes como parte da compilação noturno; de modo que no caso de uma falha de teste, a construção poderia ser retido para não falta o ambiente de implantação de destino (especificamente, neste caso, seria o ambiente que os usos da equipe de testes).

Eu não penso necessariamente que os assuntos de plataforma, mas no caso de alguém tem preocupações específicas de implementação, meu ambiente parecido com o seguinte:

Windows 7 (Desenvolvimento) / Windows Server 2008 R2 (Server) Visual Studio 2008 Team Edition (C #) Microsoft SQL Server 2008 Standard (Desenvolvimento / Server)

Eu estou usando Criar equipe para executar o meu constrói, mas que provavelmente não é um fator no âmbito da questão.

Foi útil?

Solução

Por exemplo, uma vez que um teste é executado os aspectos "criar" já foi executado. Executá-los novamente, obviamente, causar falhas, como o banco de dados não é mais intocada.

Talvez você possa fazer a sua unidade testa transacional. Executar os testes, rolo-los de volta, eo banco de dados não é alterado.

Spring tem aulas de teste de unidade transacionais que tornam este fácil de fazer. Você só precisa de um gerenciador de transações.

Outras dicas

Você pode usar SQL Server Express (I' fiz-lo com 2005, mas ainda não experimentou com 2008) a criação de bancos de dados "teste" que são armazenados como arquivos. Estes podem ser verificados no controle de origem, em seguida, as classes de teste auxiliares podem (a) copiá-las para pastas temporárias, (b) write-capacitá-los, e (c) se conectar a eles. Para restaurar o estado original, excluir a cópia temporária e repetir a-c.

Esta é uma dor enorme. Se você pode obter com transações (como duffymo sugerido) eu iria com isso. Os pontos de dor com as transações são transações aninhadas e aqueles distribuídos - atente para aqueles em seu código

.

Você pode criar um monte de fábricas de dados em testar código que inicialmente executado na inicialização do seu teste. Em seguida, use o método de reversão de transação para mantê-la intocada. Para tornar mais fácil, subclasse todas as suas classes de teste e colocar o acessor transação e código de rollback lá. código de reversão pode ser configurado para ser executado automaticamente após a conclusão de cada método de teste.

Se você está realmente executando testes de unidade para o seu repositório que estão batendo um banco de dados, você não está fazendo testes de unidade. Pode ser um teste útil, mas não é um teste de unidade. Isso é um teste de integração. Se você quiser fazer isso e chamá-lo um teste de integração, então isso é perfeitamente bem. No entanto, se você está seguindo bons princípios de design em seus repositórios, então você não precisa testar o banco de dados, nunca, em seus testes de unidade.

Muito simplesmente, o teste de unidade repositório não é testar os efeitos que largas ocorrem no banco de dados com base na entrada para o repositório; é para confirmar que a entrada para os resultados do repositório em uma chamada para um colaborador de tal e tal conjunto de valores.

Você vê, o repositório, como o resto do seu código, deve seguir o princípio único Reposibility. Basicamente o seu respoitory tem uma e apenas uma reposibility e que está a preocupações modelo de domínio API mediatas para a camada de acesso a dados technoloy subjacente (normalmente ADO.Net, mas poderia ser Entity Framework ou L2S ou qualquer outro). Indo com o exemplo do ADO.NET chamadas, o repositório não deve assumir a responsabilidade da sendo uma fábrica para a camada de dados e, em vez deve levar uma dependência em um colaborador das interfaces de dados ADO.Net (especificamente IDbConnection / IDbCommand / IDbParameter etc). Basta tomar um IDbConnection como um parâmetro de construtor e chamá-lo um dia. Isso significa que você pode escrever testes de unidade repositório contra as interfaces e simulações de fornecimento (ou falsificações ou canhotos ou o que você precisa) e confirmam que os métodos necessários, em ordem, com as entradas esperadas são feitas. Go check out my MS blogue sobre este tema exato -> http://blogs.msdn.com/b/schlepticons/archive/2010/07/20/unit-testing-repositories-a-rebuttal.aspx

Hopfully isso ajuda-lo de fazer um erro em seu teste e design no futuro.

BTW: Se você quiser teste de unidade banco de dados que você pode. Basta usar Visual testes de banco de dados do Studio. Sua INTO construído vs e tem sido em torno desde VS2005. Isso não é novidade. Mas eu preciso adverti-lo, eles precisam ser testes de unidade completamente separada.

Se o código é bastante independente de banco de dados, usando um banco de dados in-memory, como SQLite para testes de unidade (não testes de integração) vai dar-lhe os benefícios de velocidade e facilidade (suas configurações de teste inicializar o db).

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