Quais são as desvantagens do teste automatizado?


49

Existem várias perguntas neste site que fornecem muitas informações sobre os benefícios que podem ser obtidos com os testes automatizados. Mas não vi nada que representasse o outro lado da moeda: quais são as desvantagens? Tudo na vida é uma troca e não há balas de prata; portanto, certamente deve haver algumas razões válidas para não fazer testes automatizados. O que eles são?

Aqui estão algumas que eu inventei:

  • Requer mais tempo inicial do desenvolvedor para um determinado recurso
  • Requer um nível de habilidade mais alto dos membros da equipe
  • Aumentar as necessidades de ferramentas (test runners, frameworks, etc.)
  • É necessária uma análise complexa quando um teste falha é obsoleto devido à minha alteração ou está me dizendo que cometi um erro?

Editar
Devo dizer que sou um grande defensor dos testes automatizados e não estou convencido de fazê-lo. Estou procurando entender quais são as desvantagens, quando vou à minha empresa defender isso, não pareço jogar a próxima bala de prata imaginária.

Além disso, estou explicitamente não procurando alguém para disputar meus exemplos acima. Estou convencido de que deve haver algumas desvantagens (tudo tem vantagens e desvantagens) e quero entender quais são elas.


18
"Análise complexa necessária ..." o teste não é a causa da falha, é um indicador. Dizer que não ter testes significa que não é necessária uma análise complexa de falhas, do que enfiar a cabeça na lama.
precisa

11
* Construir vezes mais longos quando os testes são executados cada compilação, e repetidas código quando os testes são na muito baixo nível (teste de getters e setters)
aberração catraca

2
1. Se um desenvolvedor está usando o tempo para testar novos recursos, o risco de falhas diminui, o que significa que seu produto é mais estável. 2. Educar os membros da equipe para uma abordagem de foco no teste é uma coisa boa, eles podem usar esse conhecimento para outras coisas no trabalho (e na vida). 3. Crie uma instalação automatizada para o ambiente de teste 4. Isso indica que 1 teste faz muito.
CS01

11
Se o mesmo desenvolvedor estiver codificando os testes e codificando o código real, eles pensarão apenas nos mesmos casos de teste para escrever testes como aqueles em que pensavam quando estavam codificando.
Paul Tomblin

Acabei de postar uma resposta para a pergunta relacionada e sinto que devo pelo menos comentar esta. Na IMO, quase todas as desvantagens mencionadas aqui (e nas respostas) parecem falsas e enganosas se falamos sobre o projeto real ao vivo e não sobre algo que você codifica rapidamente e esquece. Receio que uma pergunta como essa possa ser usada como desculpa para se desenvolver sem testes automáticos e, em muitos casos, isso levará à morte do projeto ou a uma religação completa.
Boris Serebrov 29/01

Respostas:


26

Você praticamente acertou os mais importantes. Tenho algumas pequenas adições, além da desvantagem de testes realmente bem-sucedidos - quando você realmente não deseja que eles façam (veja abaixo).

  • Tempo de desenvolvimento: com o desenvolvimento orientado a testes, isso já é calculado para testes de unidade, mas você ainda precisa de testes de integração e de sistema, que também podem precisar de código de automação. O código escrito uma vez é geralmente testado em vários estágios posteriores.

  • Nível de habilidade: é claro, as ferramentas precisam ser suportadas. Mas não é apenas sua própria equipe. Em um projeto maior, você pode ter uma equipe de teste separada que escreve testes para verificar as interfaces entre o produto da sua equipe e as de outras pessoas. Muitas pessoas precisam ter mais conhecimento.

  • Necessidades de ferramentas: você está lá. Não há muito a acrescentar a isso.

  • Testes com falha: Este é o verdadeiro bugger (para mim de qualquer maneira). Há várias razões diferentes, cada uma das quais pode ser vista como uma desvantagem. E a maior desvantagem é o tempo necessário para decidir qual desses motivos realmente se aplica ao seu teste reprovado.

    • falhou devido a um erro real. (apenas para completar, pois isso é obviamente vantajoso)
    • falhou, porque seu código de teste foi gravado com um bug tradicional.
    • falhou, porque seu código de teste foi gravado para uma versão mais antiga do seu produto e não é mais compatível
    • falhou, porque os requisitos foram alterados e o comportamento testado agora é considerado 'correto'
  • Testes sem falhas: também são uma desvantagem e podem ser bastante ruins. Isso acontece principalmente quando você muda as coisas e se aproxima do que Adam respondeu. Se você alterar algo no código do seu produto, mas o teste não for responsável por isso, ele fornecerá essa "falsa sensação de segurança".

    Um aspecto importante dos testes sem falhas é que uma mudança de requisitos pode levar o comportamento anterior a se tornar inválido. Se você tiver uma rastreabilidade decente, a alteração do requisito deverá corresponder ao seu código de teste e você sabe que não pode mais confiar nesse teste. Obviamente, manter essa rastreabilidade é mais uma desvantagem. E se não o fizer, você acaba com um teste que não falha, mas na verdade verifica se o seu produto funciona incorretamente . Em algum lugar no futuro, isso o atingirá ... geralmente quando / onde você menos espera.

  • Custos adicionais de implantação: você não executa apenas testes de unidade como desenvolvedor em sua própria máquina. Com testes automatizados, você deseja executá-los em confirmações de outras pessoas em algum local central para descobrir quando alguém interrompeu seu trabalho. Isso é bom, mas também precisa ser configurado e mantido.


11
Em testes com falha, se os requisitos mudarem, fazendo com que os testes atuais falhem, o teste passa porque a implementação anterior não é mais válida, se não falhou, isso significaria que a implementação não se encaixa nos requisitos ...
CS01

O caso 4 (b) é o objetivo do desenvolvimento orientado a testes: você escreve um teste com falha, estende o produto e verifica se essa alteração faz com que o teste seja bem-sucedido. Isso protege você contra testes escritos com falha que sempre são bem-sucedidos ou sempre falham.
Kilian Foth

@Frank obrigado pela resposta. Há muita percepção lá. Apreciei especialmente as distinções de diferentes causas de falhas nos testes. Custos adicionais de implantação são outro ponto excelente.
RationalGeek

A coisa divertida que eu descobri é que meu bug por LOC é muito pior nos testes do que no código real. Passo mais tempo localizando e corrigindo erros de teste do que os reais. :-)
Brian Knoblauch

falhou, porque seu código de teste foi escrito para uma versão mais antiga do seu produto e não é mais compatível - se seus testes estão sendo interrompidos por causa disso, é provável que seus testes estejam testando os detalhes da implantação e não o comportamento. CalculateHighestNumber v1 ainda deve retornar o mesmo resultado que CalculateHighestNumber v2
Tom Squires 31/03

29

Depois de começar a tentar testes automatizados em nossa equipe, a maior desvantagem que vi é que é muito difícil aplicar um código legado que não foi projetado com o teste automatizado em mente. Sem dúvida, isso melhoraria nosso código a longo prazo, mas o nível de refatoração necessário para testes automatizados, mantendo nossa sanidade, é uma barreira muito alta para entrada no curto prazo, o que significa que teremos de ser muito seletivo quanto à introdução de automação automatizada. testes de unidade para cumprir nossos compromissos de curto prazo. Em outras palavras, é muito mais difícil pagar os cartões de crédito quando você já está com dívidas técnicas.


2
Como alguém que trabalha 80% de uma base de código herdada muito grande, eu não poderia concordar mais. No entanto, para atenuar isso, usei um pouco disso em [link] amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/… .
DevSolo

11
É um livro muito bom, eu aproveitei bastante. Três pontos principais, um pouco de cada vez. Alguns bons testes são melhores que nenhum teste. Fique no escopo, não refatorar tudo o que precisa ser refatorado de uma só vez. Seja muito claro onde estão os limites entre código testável e não testável. Certifique-se de que todos os outros também saibam.
Tony Hopkinson

21

Talvez a desvantagem mais importante seja ... testes são códigos de produção . Todo teste que você escreve adiciona código à sua base de código que precisa ser mantida e suportada. Não fazer isso leva a testes nos quais você não acredita nos resultados, então você não tem outra escolha. Não me interpretem mal - sou um grande defensor dos testes automatizados. Mas tudo tem um custo, e este é um grande problema.


Bom ponto Ross, que é uma maneira interessante de colocar isso.
RationalGeek

Concordo, embora, de qualquer maneira, na minha experiência, o tempo economizado devido a testes de unidade que encontrem instantaneamente possíveis erros no código recém-escrito (ou seja, testes de regressão) tenha superado esse tempo de manutenção adicional.
Dodgy_coder 31/10

15

Eu não diria que essas são desvantagens inteiramente aplicáveis, mas as poucas que eu mais acertei são:

  • Tempo gasto para configurar o teste em um aplicativo corporativo complexo.
  • Manipulando testes antigos que falham incorretamente, em outras palavras, o sistema evoluiu e agora os testes estão errados.
  • Falsa confiança da cobertura do teste irregular ou desconhecida.

A cobertura de teste irregular pode levar a uma falsa sensação de segurança. Se você faz um refator e usa os testes para provar sua validade, o que provou que seus testes são capazes de provar isso?

Às vezes, o tempo que leva para criar o teste é um problema para nós. Nosso teste automatizado não inclui apenas testes de unidade, mas também usa testes de caso. Estes tendem a ser mais amplos e requerem contexto.

Obviamente, minha perspectiva é de um aplicativo mais antigo que seus testes de unidade.


O OP já cobriu tempo e código obsoleto na pergunta.
precisa

@ P.Brian.Mackey, na verdade, o elemento time é subjetivo. O tempo gasto para codificar o teste é diferente do tempo gasto para entender o que o teste exige e codificá-lo corretamente.
Adam Houldsworth

@AdamHouldsworth Obrigado, esses são alguns bons exemplos de desvantagens. Eu realmente não tinha considerado o falso ângulo de confiança.
RationalGeek

9

Eu diria que o principal problema com eles é que eles podem fornecer uma falsa sensação de segurança . Só porque você tem testes de unidade, isso não significa que eles estejam realmente fazendo alguma coisa e isso inclui o teste adequado dos requisitos.

Além disso, os testes automatizados também podem incluir bugs , o que coloca a questão de saber se os testes de unidade precisam ser testados, para que não sejam necessariamente alcançados.


O Test Driven Development ajuda no primeiro, exigindo um teste com falha antes de escrever o código do recurso. Agora você sabe que, se o recurso for interrompido, o teste será interrompido. Para o segundo, código de teste complicado é um cheiro de código. Novamente, escrevendo o teste primeiro, você pode se esforçar para simplificá-lo e colocar o trabalho difícil no código do recurso que corrige o teste.
precisa

O código que é difícil de testar não é um cheiro de código. O código mais fácil de testar é uma cadeia gigante de chamadas de funções que se disfarçam de classes.
Erik Reppen

4

Embora o teste de automação tenha muitas vantagens, ele também tem suas próprias desvantagens. Algumas das desvantagens são:

  • É necessário ter proficiência para escrever os scripts de teste de automação.
  • A depuração do script de teste é o principal problema. Se algum erro estiver presente no script de teste, às vezes poderá levar a consequências mortais.
  • A manutenção do teste é cara no caso de métodos de reprodução. Mesmo que ocorra uma pequena alteração na GUI, o script de teste deve ser gravado ou substituído por um novo script de teste.
  • A manutenção dos arquivos de dados de teste é difícil, se o script de teste testar mais telas.

Algumas das desvantagens acima costumam subtrair os benefícios obtidos com os scripts automatizados. Embora o teste de automação possua profissionais e especialistas, ele é amplamente adaptado em todo o mundo.


obrigado. Bons pontos. Editei sua postagem para gramática e formatação. Espero que você não se importe.
RationalGeek

3

Recentemente, fiz uma pergunta sobre testes no desenvolvimento de jogos - é assim que eu sabia sobre esse. As respostas apontaram algumas desvantagens curiosas e específicas:

  1. É caro fazer isso quando seu código deve ser altamente acoplado .
  2. É difícil fazer isso quando você precisa conhecer as várias plataformas de hardware, quando você deve analisar a saída para o usuário e o resultado do código só faz sentido em um contexto mais amplo .
  3. Teste de interface do usuário e UX é muito difícil .
  4. E, notavelmente, os testes automatizados podem ser mais caros e menos eficazes do que vários testadores beta de baixo custo (ou gratuitos) .

O quarto ponto me faz lembrar de alguma experiência minha. Trabalhei em uma empresa gerenciada pelo Scrum, enxuta e orientada para XP, onde os testes de unidade eram altamente recomendados. No entanto, em seu caminho para um estilo mais enxuto e menos burocrático, a empresa negligenciou a construção de uma equipe de controle de qualidade - não tínhamos testadores. Com tanta frequência, os clientes encontraram bugs triviais usando alguns sistemas, mesmo com cobertura de teste> 95%. Então, eu acrescentaria outro ponto:

  • Testes automatizados podem fazer você sentir que o controle de qualidade e o teste não são importantes.

Além disso, eu estava pensando naqueles dias sobre documentação e cogitei uma hipótese que pode ser válida (em menor grau) para os testes dois. Eu apenas senti que o código evolui tão rapidamente que é muito difícil criar uma documentação que siga essa velocidade, por isso é mais valioso gastar tempo tornando o código legível do que escrever uma documentação pesada e facilmente desatualizada. (Obviamente, isso não se aplica às APIs, mas apenas à implementação interna.) O teste sofre um pouco com o mesmo problema: pode ser muito lento para escrever quando comparado com o código testado. OTOH, é um problema menor porque os testes avisam que estão desatualizados, enquanto sua documentação permanecerá silenciosa enquanto você não a reler com muito, muito cuidado .

Finalmente, um problema que às vezes encontro: o teste automatizado pode depender de ferramentas, e essas ferramentas podem ser mal escritas. Comecei um projeto usando o XUL há algum tempo e, cara, isso é doloroso para escrever testes de unidade para essa plataforma. Iniciei outro aplicativo usando Objective-C, Cocoa e Xcode 3 e o modelo de teste nele era basicamente um monte de soluções alternativas.

Tenho outras experiências sobre as desvantagens do teste automatizado, mas a maioria delas está listada em outras respostas. No entanto, sou um defensor veemente dos testes automatizados. Isso economizou muito trabalho e dor de cabeça e eu sempre o recomendo por padrão. Eu acho que essas desvantagens são apenas meros detalhes quando comparados aos benefícios dos testes automatizados. (É importante sempre proclamar sua fé depois de comentar as heresias para evitar o auto da fé.)


3

Dois que não são mencionados são:

  • Duração do relógio que pode demorar para executar um grande conjunto de testes

Participei dos esforços automatizados de controle de qualidade em que demorou meio dia para executar os testes, porque os testes eram lentos. Se você não for cuidadoso ao escrever seus testes, seu conjunto de testes também poderá ser assim. Isso não parece grande coisa até você gerenciar agora, "Ah, acabei de cometer uma correção, mas vai demorar 4 horas para provar a correção".

  • Fragilidade de alguns métodos de escrita de teste

Alguns métodos de teste (como automatizar a interface do usuário) parecem quebrar sempre que você se vira. Especialmente doloroso se o seu script, por exemplo, interromper o processo de teste porque está aguardando a exibição de um botão - mas o botão foi renomeado.

Você pode contornar essas duas coisas, com boas práticas de teste: encontre maneiras de manter seu conjunto de testes rápido (mesmo se você tiver que fazer truques como distribuir testes em máquinas / CPUs). Da mesma forma, alguns cuidados podem ser tomados para tentar evitar métodos frágeis de escrever testes.


2

Quero acrescentar mais uma, uma falsa sensação de segurança.

Além de conjuntos de problemas bem pequenos e bem definidos, não é possível criar testes abrangentes. Pode e sempre haverá erros em nosso software que os testes automatizados simplesmente não testam. Quando os testes automatizados passam, com muita frequência assumimos que não há bugs no código.


0

É difícil convencer o gestor / capitalista de risco

  • a automação automatizada aumenta o custo inicial.
  • a automação de processos aumenta o tempo de colocação no mercado.
  • o benefício da automação automatizada ocorre a médio e longo prazo. a concorrência feroz se concentra mais nos benefícios de curto prazo.

consulte Teste de unidade orientado ao mercado para obter detalhes.


-1

Uma das principais desvantagens pode ser superada usando testes de autoaprendizagem. Nesta situação, os resultados esperados são todos armazenados como dados e atualizáveis ​​com revisão mínima pelo usuário do conjunto de testes no modo de autoaprendizagem (a exibição difere entre o resultado esperado antigo e o novo resultado real - atualização esperada se pressionar y). Esse modo de aprendizado de teste precisa ser usado com cautela, para que o comportamento do buggy não seja considerado aceitável.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.