A principal desculpa do desenvolvedor por não ter um bom teste de unidade é "O código não foi projetado de maneira testável por unidade". Estou tentando entender que tipo de design e código não pode ser testado em unidade.
unit-testing
manizzzz
fonte
fonte
Respostas:
Vários fatores podem tornar o código difícil de testar na unidade. Quando este for o caso, a refatoração ajuda a melhorar o código para que seja testável.
Alguns exemplos de código que provavelmente seriam difíceis de testar:
function pGetDp_U(int i, int i2, string sText)
.Observe que a falta de arquitetura clara não torna o código difícil para o teste de unidade, pois os testes de unidade dizem respeito a pequenas partes do código. A arquitetura pouco clara ainda teria um impacto negativo na integração e nos testes do sistema.
fonte
Há muitas coisas que tornam o código difícil para o teste de unidade. Coincidentemente, muitos deles também dificultam a manutenção do código:
fonte
Exemplos comuns de código que as pessoas não desejam para o teste de unidade:
Usando uma estrutura simulada, todos esses exemplos podem ser testados em unidade. É apenas um trabalho para configurar as substituições simuladas para as dependências internas.
Coisas que realmente não podem ser testadas em unidade:
fonte
Existem algumas áreas que podem dificultar a gravação de testes de unidade. No entanto, enfatizo que isso não significa que você deva desconsiderar técnicas úteis simplesmente porque elas podem adicionar alguma complexidade ao seu teste. Como em qualquer codificação, você deve fazer sua própria análise para determinar se os benefícios ultrapassam os custos, e não aceitar cegamente o que um cara aleatório publica na rede.
Escrito mal do código projetado
Confiança do estado em um escopo diferente
O custo para a maioria deles fica fora de controle, a menos que você saiba o que está fazendo. Infelizmente, muitas vezes não sabem como usar essas técnicas de maneira a mitigar coisas como testar a complexidade.
Estado externo / do sistema
Concorrência
fonte
Não existe código que não possa ser testado. No entanto, existem alguns exemplos de código que são REALMENTE, REALMENTE difíceis de testar (a ponto de possivelmente não valer o esforço):
Interações de hardware - Se o código manipular diretamente o hardware (por exemplo, gravar em um registro para mover um dispositivo físico), o teste de unidade poderá ser muito difícil ou caro. Se você usa hardware real para o teste, pode ser caro obter feedback apropriado no equipamento de teste (ainda mais equipamentos!) E, caso contrário, é necessário emular o comportamento exato dos objetos físicos - não é um truque fácil. algumas instâncias.
Interações do relógio - isso geralmente é mais fácil, porque quase sempre é possível zombar das funções do relógio do sistema de maneira bastante trivial. Mas quando você não pode, esses testes se tornam incontroláveis - testes baseados em tempo real tendem a demorar muito tempo para serem executados, e, na minha experiência, eles tendem a ser muito frágeis, pois as cargas do sistema tornam as coisas mais demoradas do que deveriam , causando falhas no teste fantasma.
fonte
Meus três principais grupos para isso são:
código que depende de serviços externos
sistemas que não permitem que os testadores modifiquem o estado independentemente do aplicativo.
ambientes de teste que não replicam a configuração de produção.
Isso é o que eu mais experimentei como desenvolvedor que virou engenheiro de controle de qualidade.
fonte