Pergunta

Eu estou atualmente no processo de testar a nossa solução que tem toda a "gama" de camadas:. UI, Oriente, eo Banco de Dados onipresente

Antes da minha chegada em minha equipe atual, consulta teste foi feito pelos testadores de artesanato manualmente consultas que, teoricamente, retornam um conjunto de resultados que o procedimento armazenado deve voltar com base em várias regras de relevância, a triagem, o que você tem.

Isto teve o efeito colateral de erros está sendo movida contra a consulta do testador mais frequentemente do que contra a consulta real em questão.

propus realmente trabalhando com um conjunto de resultados conhecido que você poderia simplesmente inferir como ele deve retornar desde que você controlar os dados presentes -. Anteriormente, os dados foram extraídos de produção, higienizado, em seguida, povoada em nossos bancos de dados de teste

As pessoas ainda insistiam em criar suas próprias consultas para testar o que os desenvolvedores criaram. Eu suspeito que muitos ainda estão. Eu tê-lo em minha mente que este não é o ideal em tudo, e só aumenta a nossa pegada de teste desnecessariamente.

Então, eu sou curioso, que as práticas que você usa para cenários de teste como este, e que seria considerado ideal para a melhor cobertura end-to-end que você pode obter, sem a introdução de dados caóticos?

O problema que tenho é onde é o melhor lugar para fazer o teste. Eu só picar o serviço diretamente, e comparar esse conjunto de dados para que eu possa puxar a partir do procedimento armazenado? Eu tenho uma idéia, e foram o suficiente bem sucedida até agora, mas eu sinto que nós ainda estamos perdendo algo importante aqui, então eu estou olhando para a comunidade para ver se eles têm alguma informações valiosas que podem ajudar formular a minha abordagem de teste melhor.

Foi útil?

Solução

Testes procedimentos armazenados, será necessário que cada pessoa que testa tem uma instância separada do db. Este é um requisito. Se você compartilhar ambientes que você não será capaz de confiar nos resultados do seu teste. Eles vão ser inútil.

Você também vai precisar para assegurar que você reverter a db ao seu estado anterior depois de cada teste, de modo a tornar os resultados previsíveis e estáveis. Devido a essa necessidade de reverter o estado depois de cada teste estes testes vai levar muito mais tempo para concluir que os testes unitários para que eles provavelmente vai ser algo que você deseja executar durante a noite.

Existem algumas ferramentas para fora lá para ajudá-lo com isso. DbUnit é um deles e eu também acredito que a Microsoft tinha uma ferramenta Visual Studio para profissionais de banco de dados que continha algum apoio para testes DB.

Outras dicas

Aqui estão algumas orientações:

  1. Uso de um banco de dados isolado para teste de unidade (por exemplo Nenhum outro teste é executado ou actividade)
  2. Sempre inserir todos os dados de teste que você pretende consulta dentro do mesmo teste
  3. Escrever os testes para criar aleatoriamente diferentes volumes de dados, por exemplo, número aleatório de inserções dizer entre 1 e 10 linhas
  4. Randomizar os dados, por exemplo, para uma inserção aleatória boolean campo e verdadeiro ou falso
  5. Mantenha uma contagem no teste das variáveis ??(por exemplo, número de linhas, número de Trues)
  6. Para o Asserts executar a consulta e comparar com variáveis ??de teste locais
  7. Usar empresas de serviços transações ao banco de dados de reversão ao estado anterior

Veja o link abaixo para a técnica de empresas de serviços de transação:

http://weblogs.asp.net/rosherove/articles/DbUnitTesting.aspx

Como parte de nossa integração contínua, corremos o nosso 'build' nightly das consultas de banco de dados. Trata-se de um conjunto de chamadas de banco de dados, que são atualizados regularmente das chamadas reais no código, bem como qualquer esperava consultas ad-hoc.

Estas chamadas são cronometrados para garantir que:

1 / Eles não levam muito tempo.

2 / Eles não diferir muito (de uma forma ruim) a partir da noite anterior.

Desta forma, podemos pegar consultas errantes ou DB muda rapidamente.

O planejador de consultas é seu amigo, especialmente neste caso. É sempre uma boa prática para verificar para ver que os índices são usados ??quando você espera que eles sejam e que a consulta não exige trabalho extra a ser feito. Mesmo que você tenha testes de estresse incluído na sua suite, ainda é uma boa idéia para pegar consultas caras antes de seu aplicativo começa a paralisação.

Temos um conjunto de banco de dados em branco de lado para cada desenvolvedor e testador.

Quando os testes são executados - cada teste limpa o banco de dados e carrega os dados que está esperando para usar. Isto dá-nos um estado conhecido em todos os momentos.

Podemos então testar vários cenários diferentes na mesma DB (um após o outro) e nós nunca acabar em outro testadores dedos.

que cobre testando os dados de acesso em si. Para o serviço de testes que fazemos a mesma coisa, mas nós testamos o interior apenas o serviço - nós realmente não atingiu o serviço que criar uma instância da classe de processamento de serviço e passar tudo o que precisamos. Dessa forma, estamos testando o código e não a infra-estrutura (mensagem etc ..)

Django oferece uma capacidade de teste de unidade de banco de dados. Você pode emprestar suas idéias de design e reproduzi-lo em outros ambientes.

O pessoal do Django oferecer uma subclasse da classe TestCase unittest padrão do Python que preenche um banco de dados com um dispositivo elétrico conhecido -. Um conjunto conhecido de linhas de dados

No caso de Django (e Python) é mais fácil para preencher o banco de dados a partir de um extrato de dados JSON. Outros formatos de arquivo para o equipamento pode ser utilizado para outros frameworks. Por exemplo, se você estiver trabalhando em Oracle, que você pode encontrar arquivos mais fácil trabalhar com CSV.

Esta subclasse TestCase permite escrever um TestCase típico para o futuro que exerce o banco de dados com o dispositivo de dados conhecida.

Além disso, o teste de corredor Django cria um esquema temporário para fins de teste. Isso é fácil para Django porque eles têm um componente de gerenciamento de objeto-relacional completo que inclui a criação de DDL. Se você não tem esta disponível, você ainda vai precisar do script DDL para que você possa criar e dispor de um esquema de teste para fins unittest.

SQLServerCentral tem um artigo aqui (você pode ter que registrar, mas é livre e sem cordas) sobre um framework de testes unitários TSQL chamado tsqlUnit. É open source e segue ao longo da tradição do quadro xUnit.

Segue-se o padrão de assento TDD:

Configuração - preparar as condições de teste através da manipulação dos objetos, tabelas e / ou dados

Exercício - invocar o código de produção

Assert - Verifique se o resultado real é igual ao resultado esperado

Teardown - retorno tudo voltar a ser como era antes do teste começar. Este é realmente feito por reverter uma transação, o que mantém tudo bonito e arrumado.

Apesar de eu não tê-lo usado, parece promissor e é certamente algo que vai estar olhando mais detalhadamente.

O quadro pode ser baixado aqui .

Acho que é útil para testar o SQL que está sendo enviado para o banco de dados e não o resultado de consultar o banco de dados.

Não que eu não faço mais tarde, mas acho que é muito mais rápido para teste para isso do que ter o banco de dados muito de elevação.

Esta é uma configuração pesada, mas eu recomendo recipientes TDDing.

Ao executar o seu script de teste, construir um novo recipiente que tem o seu banco de dados rodando dentro, semente-lo com dados simulados, em seguida, executar as consultas e teste contra o que foi devolvido e se ou não as consultas foram bem sucedidos.

Desta forma, você tem controle sobre o quão perto a produção de seu ambiente de teste.

ThoughtWorks

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