Marcação de unidade-testes
-
09-09-2019 - |
Pergunta
Eu estou trabalhando em um projeto PHP com cobertura em testes de unidade sólida.
Eu tenho notado, que da última vez, eu estou fazendo manipulações muito complicado com Command-Line Test Runner testa unidade' -. Filtro Comando
Aqui está a explicação deste comando da documentação oficial:
- Filtro
Apenas executa testes cujo nome corresponde ao padrão determinado. O padrão pode ser o nome de um único teste ou uma expressão regular que corresponde a vários nomes de teste.
Eu ofter usá-lo porque, por vezes, torna-se muito útil para executar apenas um conjunto de testes simples ou caso de teste de toda a base de teste.
Eu estou querendo saber se isso é uma boa prática ou não?
Ouvi dizer que às vezes é uma boa prática para executar toda a suíte de testes em sua máquina de integração contínua, se você sabe com certeza que você tenha modificado apenas um componente e 100% por cento confiante , que não deixará de unidade-testes do outro componente. O que você acha sobre isso?
Algum tempo atrás eu pensava que não devemos nos preocupar tanto sobre o tempo precisa para executar todo o conjunto de todas as unidades-testes, mas quando você tem muito complicada lógica de negócios e unidade-testes -. Isso pode levar um tempo significativo
Eu entendo, que "reais" unidade-testes não devem interagir com DB, o uso de simulação / stubs objetos, eu concordo com isso. Mas, às vezes, é muito mais fácil (mais barato) para usar luminárias DB para os testes.
Por favor me dê alguns conselhos, como este problema pode ser resolvido?
Solução
testes de unidade bom deve:
- têm nomes métodos claros e nomes de variáveis ??para atuar como documentação
- Executar rápido. Isso também será possível para o teste com o negócio complicado lógica. Teste deve ser executado em uma avarage tempo de algo em torno de 0,1 segundo.
- Test exatamente uma coisa em um método de teste
- Não se integrar com recursos externos, como o sistema de arquivos, e-mail, bases de dados, webservices, e todo o resto. Você pode criar testes de integração de banco de dados separado para testar sua ineraction banco de dados. Estes testes serão mais lento, em seguida, a sua unidade testar a maior parte do tempo. eu coloquei Meu testes de integração em um independentes projeto e eu executá-los somente quando estou trabalhando no código de integração. Eu também executá-los em todas as compilações na CI servidor.
- estar completamente isolados uns dos outros. Quando você tem testes de função no outro, você não pode ver o que seu problema é de leitura que testes são falhou. Você pode ter que depurar para encontrar o problema. Isolado testes você vai economizar muito tempo.
Pessoalmente, eu não uso nomes de categoria em meus testes. Uso 2 projectos de ensaio por aplicação. Um para o teste de unidade e um para os testes de integração e testes mais lentas.
Reação em:
"Mas, às vezes, é muito mais mais fácil (mais barato) para usar dispositivos elétricos dB para os testes. "
Quando seu código é bem escrito, será mais fácil para zombar. Eu não sei sobre zombando de estruturas em PHP, mas eu usá-los em outros idiomas para me salvar um monte de tempo. Escrevendo primeiro teste e código mais tarde pode ajudá-lo a projetar seu código para ser testável mais fácil.
Pessoalmente eu aprendi a teste melhor por
- ler blogs sobre o assunto
- leitura de livros sobre o assunto
- leitura de código testado escrito por outros
- escrevendo um monte de testes, é claro. Levei alguns thousends de testes para se tornar bom nisso.
Outras dicas
Eu ofter usá-lo porque, por vezes, torna-se muito útil para executar apenas um conjunto de testes simples ou caso de teste de toda a base de teste.
Eu estou querendo saber se isso é uma boa prática ou não?
Claro, contanto que você executar o conjunto completo de unidade-testes ocasionalmente (através de um CI sons servidor perfeito)
Realização dos testes "interessantes" regularmente é melhor do que correr todos os testes raramente ..
Eu resolver a questão por ter um subconjunto de testes ( "testes de fumo") que levam 1 minuto ou menos que deve ser executado antes de cometer, em seguida, executar o conjunto completo de testes de seu CI servidor.
Se o seu conjunto completo de testes leva> 15 minutos, em seguida, eu olharia para dividi-los e executá-los em paralelo.
Em seguida, você pode usar o --filter para executar os testes que você está mais interessado em primeiro lugar, então a fumaça testa antes de cometer, e ter o resto correr a partir do servidor de CI.