Se o teste de unidade é tão bom, por que mais empresas não estão fazendo isso? [fechadas]

103

A primeira empresa de software real em que trabalhei era toda sobre testes de unidade (NUnit). Não sei se éramos realmente defensores disso naquela época - não tenho ideia de como era nossa cobertura de código e estava escrevendo a maioria dos testes de unidade. Desde então, encontrei algumas empresas que fazem muitos testes, mas são testes de cadeira: depende da presença de uma pessoa, tem baixa repetibilidade e baixa chance de detectar bugs. A outra atitude é: era algo que eles queriam fazer "no futuro"; basicamente quando o dinheiro cai do céu.

Sinto falta dos testes de unidade - eles apenas tornam a vida mais fácil. Mas estou descobrindo que, quando procuro um novo emprego, o teste de unidade é algo que as empresas gostariam de "fazer" no futuro ou algo que elas não fazem de jeito nenhum (uhh, já existe há um tempo agora!). Eu diria que 60-75% das solicitações de trabalho que examinei nos últimos 2 anos não listaram nenhum teste de unidade. Só consigo pensar em um ou dois que tiveram experiência em testes de unidade como um requisito (para uma posição de desenvolvedor de nível médio).

Portanto, a questão é: o que está faltando ? Acho que torna as pessoas mais produtivas, mas isso só depois de passar uma boa quantidade de tempo realmente fazendo isso. Não existem bons estudos sobre a economia de custos dos testes de unidade? É o tipo de empresa que estou procurando?

Edit: embora o título seja um pouco defensor do demônio, me considero um proponente de testes de unidade.

jcollum
fonte
Em que tipo de domínio você está trabalhando? Sempre encontrei testes de unidade, de abrangência variável, onde quer que trabalhe. Mas minha experiência está em imagens médicas e industriais, então pode ser por isso ...
Kena
11
Teste da cadeira: a pessoa senta na cadeira, dirige o aplicativo, relata bugs.
jcollum
3
@Darknight deve ter 50k upvotes por sua honestidade. Vamos, velhos cabeças, voltem-se para os tempos de hoje. Mantenha essa porcaria de teste de unidade nos anos 90, onde ela pertence. A maior perda de tempo. É apenas algo para mostrar para que você possa parecer importante, mas não faz absolutamente nada na maioria dos casos. Temos algo chamado IDE atualmente, não estamos mais programando por console ou bloco de notas. Sabemos que nosso código está correto porque podemos passar o cursor sobre o texto e ver os valores. Mantenha os testes de unidade no passado com todos os outros veteranos.
portfólio de
1
@portfoliobuilder Sim, passar o mouse sobre os valores em seu IDE realmente ajudará a melhorar a qualidade do código. Porque o estado será sempre o mesmo e o código nunca mudará. Pode apostar! E boa sorte.
Franz D.
1
@portfoliobuilder - você esqueceu / s
ocodo

Respostas:

112

Na minha experiência, existem alguns fatores envolvidos nisso:

  1. A gerência realmente não entende o que o teste de unidade realmente é, ou por que ele tem um valor intrínseco real para eles.
  2. A gerência tende a se preocupar mais com a entrega rápida do produto e (incorretamente) vê o teste de unidade como contraproducente para esse objetivo.
  3. Há uma percepção equivocada de que o teste pertence apenas ao controle de qualidade. Os desenvolvedores são programadores e não podem escrever testes.
  4. Existe um equívoco comum de que a gerência terá que gastar dinheiro para fazer testes de unidade corretamente, apesar do fato de que as ferramentas estão disponíveis gratuitamente. (Há, é claro, o tempo de aceleração do desenvolvedor a ser considerado, mas não é realmente proibitivo.)
  5. A resposta de Will completará esta resposta: É muito difícil determinar o valor do código de teste (editar jcollum)

Naturalmente, existem outros fatores, mas esses são exatamente os que encontrei até agora.

Mike Hofer
fonte
Sim, praticamente descrevi minha gestão e não temos nenhum teste.
Ty.
E o suporte para ele em alguns idiomas populares (C / C ++) é pobre.
Martin Beckett
@mgb - CxxUnit funciona muito bem para mim ...
Dominic Rodger
2
CxxTest também é muito bom. Devido aos mecanismos de reflexão pobres em C ++, parece que há mais "soluções" variadas apresentadas; CxxTest requer uma etapa de pré-processamento no sistema de compilação, enquanto ferramentas como TUT são inteiramente em tempo de compilação e suportadas por linguagem, mas difíceis de usar.
Tom
2
Descobri que os usuários do stackoverflow.com tendem a culpar o gerenciamento por muitos de seus problemas como esses. Quando pergunto a meus amigos da vida real sobre os "problemas administrativos" que surgem, geralmente descobri que eles nunca expressaram suas preocupações à administração, e muito menos devem embarcar em uma campanha para mudar os pontos de vista das pessoas. Em vez de dizer 'a administração não ...', tento pensar em maneiras de ajudar a administração a ver meu ponto de vista e convencê-los de que minha posição está correta. Acho que isso é um problema porque os desenvolvedores não são bons em vender testes de unidade.
Brian Stinar,
87

1) É difícil
2) Leva tempo
3) É muito difícil determinar o valor do código de teste

O ponto 3 é pegajoso. Bons testes de unidade reduzem os bugs. Mas o mesmo acontece com um bom código de produção. Como você determina quantos bugs não existem por causa de seus testes de unidade? Você não pode medir o que não existe. Você pode apontar estudos, mas eles não se encaixam bem na planilha do seu gerente de negócios.

irão
fonte
11
"Bons testes de unidade reduzem bugs. Mas o mesmo acontece com um bom código de produção." - Bons testes de unidade permitem melhorar o código de produção. Mesmo que o código seja ruim a princípio, mas você tenha uma boa cobertura de teste, pode refatorar o sistema com segurança até que o código esteja bom.
Esko Luontola
1
Esko, além de ter uma boa cobertura, você também precisa ter bons testes que realmente testem algo. Você poderia ter 100% de cobertura de código e realmente testar muito pouco
Jacob Adams
Excelente resposta! Você disse a mesma coisa que minha resposta em muito menos palavras.
Quarta
2
Sim, os testes de unidade demoram. Mas também a "correção de bug aleatória". O desenvolvimento direcionado por teste adequado tem "todos" os recursos "documentados" nos testes. Se os testes forem verdes, o produto funciona conforme o esperado (exceto para problemas de usabilidade, etc.). Minha experiência é que o tempo total de desenvolvimento quase não é afetado. Você gasta mais tempo com as coisas e acerta na primeira vez, em vez de depois de tempo gasto na correção de bugs.
Arve Systad
1
Não. Pelo mesmo período de tempo, recebo 3-4 vezes mais códigos / recursos de produção concluídos com a mesma quantidade de bugs por recurso. Isso varia de desenvolvedor para desenvolvedor, mas geralmente os desenvolvedores ruins também escrevem testes ruins e ainda cometem muitos erros, então o teste de unidade não melhora a qualidade do código - apenas os torna mais lentos. Os testes nunca provam a ausência de bugs, apenas sua presença, na melhor das hipóteses.
KolA
70

É fácil colocar toda a culpa na "gestão". Mas a gerência está realmente dizendo para você especificamente não fazer nenhum teste de unidade?

O gerenciamento em geral não diz (e provavelmente não deveria) dizer a você como fazer seu trabalho, seja modularização, tipos de dados abstratos, padrões de projeto ou testes de unidade. Essas são ferramentas comerciais que um engenheiro de software competente e bem-sucedido aplica, mas um engenheiro pobre não.

Acho que a verdadeira resposta à sua pergunta é: o teste de unidade é realmente difícil e os alunos de ciência da computação não são treinados para isso.

É fácil quando você está escrevendo sua própria classe de string. Quando você está testando um produto da vida real, você se depara com desafios sobre os quais ninguém lhe falou nos slides do PowerPoint:

  • Interação com o usuário. Metade do seu aplicativo é a lógica da interface do usuário. Como você testa de forma automatizada, que não quebra se você mover um botão?
  • Interação com APIs e frameworks externos. Se você estiver escrevendo um driver de kernel do Windows, como fará o teste de unidade? Você escreve stubs para cada IRP e função do kernel que usa, criando efetivamente uma simulação do kernel do sistema operacional?
  • As comunicações em rede são a moda do século 21. Como você coordena um teste de unidade que consiste em vários componentes distribuídos?
  • Como você escolhe bons casos de teste? Costumo ver pessoas tentando a abordagem “fazer coisas aleatórias em um loop de 1000 iterações e ver se quebra”. Quando você faz isso, o esforço é maior do que o retorno, erros importantes são perdidos e o teste de unidade é abandonado.
  • Como você testa se os requisitos de desempenho são atendidos?
  • O conhecimento dos padrões de teste é escasso: stubs, respostas prontas, teste de regressão são conceitos que a maioria das pessoas não conhece. Quantas pessoas em seu local de trabalho realmente leram um livro sobre testes de unidade?

A única coisa pela qual podemos culpar o gerenciamento é que as especificações de requisitos raramente contêm quaisquer requisitos no nível de qualidade da entrega.

Na próxima vez que seu chefe pedir que você faça uma estimativa de tempo, inclua o tempo para escrever um teste de unidade e veja o que acontece.

Flodin
fonte
2
Boa ideia. Mas não chame o tempo para criar testes de unidade separados do tempo para criar o código do "produto"!
Jeff Kotula
3
Ler esta resposta me fez perceber que, embora eu esteja familiarizado com o conceito e os fundamentos do teste de unidade, eu realmente não sei como fazê-lo com eficácia. Você pode recomendar um bom livro sobre o assunto?
bretão
1
Em um driver de kernel em que trabalhei, refatorei um monte de código em uma biblioteca que vinculei a um equipamento de teste de modo de usuário. Esse código em particular era independente do ambiente, então era bastante fácil. Eu não tentei, mas IRPs, como sistemas de arquivos e bancos de dados, devem ser simuláveis.
George V. Reilly
1
Com Bochs ou QEMU, é possível escrever uma simulação de seu dispositivo para o driver do kernel falar.
Zan Lynx,
2
@floding, resposta fascinante. Acho que vou ter que ler um livro sobre testes de unidade.
Dan Rosenstark de
28

A maioria dos testes não testa nada.
Você escreve uma função fileopen () e um unittest que falha se o arquivo não existir e é bem-sucedido se o arquivo existir. Ótimo! Você verificou se funciona com o nome do arquivo em chinês BIG5? em um compartilhamento NFS? no Vista com o arquivo em uma chave USB e UAC ligado?

O problema é que os testes de unidade são escritos pelo mesmo programador que escreveu a função, para o mesmo conjunto de suposições e com o mesmo nível de habilidade. Para realmente funcionar, os testes devem ser escritos por outra pessoa, apenas de acordo com as especificações publicadas, sem que eles vejam o código. - Na maioria das empresas, apenas obter especificações escritas seria um grande avanço!

Os testes de unidade verificam se há erros no código de funções individuais. Eles podem funcionar para camadas de acesso a dados, bibliotecas matemáticas, etc, onde as entradas / saídas são bem conhecidas e a estrutura interna é complexa, mas para muitos casos, eles são apenas uma perda de tempo.
Eles falham quando os erros são devido a interações entre diferentes partes do código ou com o sistema operacional e o usuário. Problemas como configurações de DPI alto / baixo bagunçando uma caixa de diálogo ou uma configuração de idioma estrangeiro trocando um '.' e ',' geralmente não são encontrados.

Martin Beckett
fonte
15
Acho que essa resposta erra um pouco o alvo. O teste de unidade e o teste funcional não são, e não devem ser, a mesma coisa.
Quarta
5
Um elemento que está faltando é que os testes de unidade não são apenas uma coisa pronta. Se eu descobrir mais tarde que preciso consertar um bug com fileopen () em um compartilhamento NFS, posso adicionar um teste ao meu conjunto de testes para isso. Então, quando eu fizer mais desenvolvimento no futuro, tenho testes de regressão em vigor.
Paul Osborne
2
Muitos erros vêm de interações fora do código que os programadores não pensaram e não podem ser encontrados simplesmente verificando o código. Um problema comum de interface de usuário são máquinas com configurações de DPI muito altas / baixas - você pode testar a unidade da função de diálogo o quanto quiser, mas não detectará isso.
Martin Beckett
5
essa não é a função de um teste de unidade, porém, e a interação entre diferentes partes do código é muito testável por unidade e, de fato, se essas partes estiverem sendo escritas por equipes separadas, o teste de unidade de seu código em uma interface compartilhada e simular o componente da outra equipe são boas práticas.
Steven Evers
1
O TDD lida com o problema de teste manipulado de "o programador que escreveu o código também escreve os testes", fazendo você escrever os testes antes de escrever o código.
Ophidian
15

Foram feitos estudos sobre o ROI dos testes de unidade - veja esta pergunta .

Dominic Rodger
fonte
15

Eu encontrei muitos desenvolvedores que não estão interessados ​​em testes de unidade. Sempre parece ser muito trabalhoso, com pouca recompensa quando você começa. Ninguém quer se inscrever para um trabalho extra e por isso resistem. Uma vez que as pessoas começam, elas geralmente se apegam a ele com entusiasmo, mas pode ser difícil começar.

Steve Rowe
fonte
12

Além da questão da adoção do teste de unidade, o teste de unidade nem sempre vale a pena, embora em geral eu pense que sim, quando aplicado corretamente. Não há nada de especial nos testes de unidade que os evite de serem vulneráveis ​​a construções ruins.

Os testes de unidade têm custos (criação, manutenção e execução) e só valem a pena se fornecerem benefícios maiores do que esses custos. A criação de testes é uma habilidade como qualquer outra, requer experiência e conhecimento específicos para o sucesso. Sem experiência suficiente, é muito fácil, mesmo para desenvolvedores experientes, criar testes de unidade de baixa qualidade, baixo valor e / ou alto custo que não valem a pena. Especialmente considerando o quão difícil pode ser julgar o valor de um teste de unidade.

Além disso, o teste de unidade é apenas uma maneira de melhorar a qualidade do código, mas não é a única maneira. Em algumas circunstâncias e com algumas equipes, pode não ser a maneira mais eficaz de aumentar a qualidade do software.

Lembre-se de que colocar muito esforço em testes de unidade não é garantia de software de qualidade. E, também, é possível produzir software da mais alta qualidade sem qualquer tipo de teste de unidade.

cunha
fonte
O que você está dizendo é verdade em linguagens tipadas estaticamente. Em linguagens tipadas dinamicamente, eles são absolutamente críticos. Quero dizer, é quase certo que seu código será uma porcaria sem os testes. Acho que essa é uma grande parte do motivo pelo qual algumas pessoas parecem valorizar tanto os testes de unidade.
Bill K,
11

Bem, minha empresa não adotou TDD ou Testes Unitários. Para ser honesto, não temos certeza de como fazer isso. Obviamente, podemos fazer isso para funções estúpidas como CapitalizeString (), etc, mas não sabemos como fazer para sistemas altamente complexos com objetos complicados. Além disso, a maioria das pessoas entrevistadas tem experiência zero ou experiência limitada. Parece que o Teste de Unidade é grande na multidão do SO, mas não é particularmente grande no pool de trabalho disponível.

TDD é um tópico separado. Somos moralmente contra o TDD. Não somos programadores cowboy, mas acreditamos que isso prejudica a criatividade e a flexibilidade de um projeto. Além disso, não faz sentido ter o codificador que escreveu a função de teste de unidade. Quando eu faço algo, eu codifico para todos os casos extremos que posso pensar. O que preciso é de outro cérebro para procurar coisas que posso ter perdido. Nós não temos isso. As equipes são pequenas e independentes.

Resumindo, não acreditamos em TDD, mas gostaríamos de fazer o Teste Unitário. Simplesmente não temos experiência para fazer isso e não podemos encontrar isso facilmente.

Steve
fonte
1
Na época em que o lugar em que trabalho tinha codificadores suficientes para isso, fazíamos programação em pares. Achei muito eficaz para um escrever testes enquanto o outro codificava. Isso também levou a perguntas muito inteligentes sobre o código.
Zan Lynx,
4
A questão do TDD, que você parece não ter percebido, é que você escreva todos os casos extremos em seu teste de unidade. Para cada caso, você escreve uma afirmação em seu teste de unidade. Então, se o seu código real falhar em uma afirmação, você saberá que seu código contém um bug e implementou sua lógica incorretamente. Como as unidades são pequenas e sua declaração testa o código específico na unidade, deve ser fácil identificar onde está o erro lógico. O importante é que você escreva suas afirmações primeiro. Em seguida, faça seu código passar. Você pode apontar onde esse processo atrapalha tudo, menos o crescimento de insetos?
Christopher Parker
3
Tentar fazer um teste de unidade sem escrever os testes primeiro será muito difícil. Isso ocorre porque será difícil fazer um teste retrospectivo de seu código. Este é um dos principais benefícios de testar primeiro: o design pode ser testado desde o início porque os testes conduziram o design.
Alan Christensen
3
Como pode ser que você "não tenha certeza de como" fazer o teste de unidade, mas acredita que o TDD atrapalha a criatividade e a flexibilidade?
jcorcoran
1
@Steve 6 anos depois, seria bom saber se você já introduziu o teste de unidade (ou mesmo TDD) e se você continuou com ele.
Luke Puplett
11

Existem muitas empresas por aí que realmente não fazem nada em relação às melhores práticas. Sem revisões de código, sem testes de unidade, sem planos de teste, sem nada, apenas pelo assento de suas calças.

Aproveite esta oportunidade para levá-los a usar uma plataforma de Integração Contínua e desenvolver testes de unidade! Uma maneira fácil de impressionar os poderosos e aumentar a qualidade e estabilidade do seu código ao mesmo tempo

Edit: Quanto à razão, acho que eles simplesmente não estão cientes das ferramentas atuais que tornam o CI e os testes de unidade extraordinariamente fáceis.

Allen Rice
fonte
Normalmente estou em uma posição em que não tenho nenhuma influência sobre decisões políticas como essas; Sou o senador júnior sendo rejeitado por presidentes de comitês.
jcollum
Leva alguns minutos para iniciar o Hudson e escrever testes de unidade. Se os testes de unidade já estiverem em sua lista "TODO", você está apenas fazendo seu trabalho. Os comitês geralmente ficam impressionados com gráficos e imagens sofisticados, então mostre a eles alguns gráficos de tendências bonitos de Hudson;)
Allen Rice
sim! Vamos ouvir a verdade. Apesar de todo o tempo que nós, desenvolvedores, gastamos discutindo sobre as melhores práticas, nem sempre elas são usadas no mundo real. Pena mesmo.
NeedHack
Os médicos não perguntam se devem lavar as mãos, certo?
ocodo
6

Pelo que tenho visto, muitas empresas têm bases de código enormes e altamente acopladas que não são praticamente testáveis ​​por unidade. Eles também não têm requisitos testáveis ​​decentes, portanto, os testes de unidade seriam testados em relação aos requisitos de fato "conforme construído".

Rob K
fonte
Isso merece mais votos positivos. Código que foi projetado através do princípio "o que é design" / "Just do it !!" resultando em uma grande bola de lama não terá separação / modularidade (ou seja, unidades ), portanto, é resistente a testes de unidade . Um dos benefícios de testar primeiro é que a modularidade se torna automática. Uma das consequências desastrosas de nenhum teste é que provavelmente se tornará impossível testar o código no futuro.
ocodo
6

Não acho que preguiça seja a causa raiz de testes de unidade ruins. Para minha empresa, as limitações de tempo e a atitude de "basta fazer" são os maiores impedimentos para fazer testes de unidade. Além disso, os locais onde nossos sistemas falham tendem a ser mais no nível de integração (serviços, acessos ao banco de dados, consultas complexas que requerem dados específicos para teste), não no "nível da unidade". Essas coisas são apenas mais difíceis de testar e, se você mal tiver tempo para concluir o recurso, provavelmente não terá tempo para fazer nenhum teste útil ao mesmo tempo.

Andy White
fonte
Isso é comum. Acho que o argumento é que, se você acha que algum dia mudará isso no futuro, deve ter um teste que verifique se está funcionando depois de mudar.
jcollum de
6

O teste de unidade deve ser apenas uma parte natural do fluxo de trabalho de desenvolvimento de código, assim como o compilador.

No entanto, isso requer educar o gerenciamento sobre os benefícios dos testes de unidade. No entanto, os desenvolvedores juniores têm chances relativamente baixas de exercer tal influência. Portanto, se uma empresa é uma proponente do teste de unidade depende se ela tem um desenvolvedor sênior ou arquiteto que defende o teste de unidade.

Acredito que esta seja a resposta à sua pergunta "o que está faltando e por que não há mais empresas fazendo testes de unidade" . :-)

Franci Penov
fonte
1
+1 para "deve ser uma parte natural do fluxo de trabalho de desenvolvimento de código". Cada desenvolvedor profissional deve fazer seus próprios testes de unidade , independentemente do processo oficial. O único argumento legítimo sobre esta questão é a definição de uma unidade .
Dunk em
1
@Dunk Se você não definir "unidade", estará apenas dizendo que "desenvolvedores profissionais devem fazer seus próprios testes".
ChrisW
1
@ChrisW - Sim, os desenvolvedores profissionais devem fazer seus próprios testes. Não há razão para um desenvolvedor entregar um código que não tenha testado o suficiente para se sentir confiante de que funciona corretamente. Infelizmente, isso parece exigir muito de muitos desenvolvedores.
Dunk em
1
Quando digo que a definição de uma unidade é um argumento legítimo, estou falando sobre a granularidade de uma unidade. É uma aula? É uma coleção de classes? É um componente? Acho que o teste de unidade em nível de classe (com algumas exceções) custa mais do que beneficia e leva a muitos testes sem sentido ...
Dunk
que outros apontaram neste tópico. Por outro lado, se alguém definir uma coleção de classes que funcionam juntas como uma unidade, você ainda pode fazer testes automatizados e seus testes são geralmente mais significativos porque podem se concentrar mais na funcionalidade necessária de nível superior.
Dunk em
5

Provavelmente é uma combinação de algumas coisas que você já mencionou. É difícil medir as economias de custo de TDD. Se você deseja terceirizar sua TI, pode mostrar quanto você paga por ano para os funcionários que você tem em comparação com o custo de terceirizar; é muito concreto. Como você diz, "Oh, este teste detectou um bug que levaria 4 horas para depurar e corrigir ..."?

Ovi Tisler
fonte
Como você pode adivinhar quanto tempo um bug levaria para depurar e consertar. Geralmente a depuração é mais aleatória do que na minha experiência - acontece que tenho uma ideia de onde está o problema ou não.
Dominic Rodger
1
Sim, é por isso que eu disse que é tão difícil quantificar os benefícios do teste.
Ovi Tisler
5

O motivo pelo qual alguns lugares não o usam é simplesmente porque é preciso muito trabalho para começar e continuar. O fato de escrever testes de unidade levar tanto tempo quanto escrever a funcionalidade real parece para alguns gerentes que você está cortando a produtividade do desenvolvedor pela metade.

Além disso, você constrói uma equipe (ou alguém) precisa colocar a infraestrutura no lugar e mantê-la.

E, como diz Alan , muitos lugares simplesmente não usam as melhores práticas - eles apenas querem ver algo tangível.

Michael Burr
fonte
5

Acho que o programador precisa apenas começar a fazer isso. Alguns testes simples para começar são fáceis de justificar como parte do desenvolvimento.

Quase sempre é necessário algo como um teste de unidade para obter uma resposta rápida de depuração. Apenas explique como é muito mais rápido iniciar o teste do que organizar a entrada correta, definir um ponto de interrupção do depurador, iniciar o aplicativo, etc.

Documente o teste em seu código. Basta colocar um comentário explicando onde está o teste e como executá-lo. Os futuros programadores verão isso e, com sorte, os testes se espalharão!

Zan Lynx
fonte
4

Teste de unidade é um daqueles termos da caixa preta que a maioria das pessoas já ouviu, mas não sabe exatamente o que constitui um teste de unidade, por onde começar, como escrevê-los, como realmente executar testes, o que exatamente eles deveriam testar, etc. . etc etc.

Em muitos casos, é mais fácil para o desenvolvedor inseguro simplesmente descartá-los como desnecessários ou alguma cobertura que apenas "desenvolvedores de nível corporativo" precisam.

Soviut
fonte
4

Sou um grande fã de testes unitários e também sou sócio de uma empresa que desenvolve projetos de desenvolvimento de contratos para vários tipos de clientes. Em um mês, tocaremos de 3 a 4 projetos diferentes de tamanhos variados.

Se um projeto parece que vai ser único, não vou investir muito em testes de unidade porque esse teste de unidade não compensa para o meu negócio. Nesses tipos de projetos, irei testar a unidade de coisas que não tenho certeza / com as quais estou familiarizado ou que podem mudar com frequência (como um analisador para uma fonte de dados que não controlo).

Por outro lado, se estou construindo algo que sei que terá um longo tempo de vida, é um trabalho maior, com o qual trabalharei por meio de várias iterações ou que terá um grande impacto em meus clientes se ocorrer um erro , Vou investir em mais testes de unidade. Mais uma vez, a prioridade dos testes gira em torno de código incerto / desconhecido / em mudança.

Acho que os testes de unidade devem girar em torno da complexidade de uma tarefa, bem como se eles vão valer a pena. Não faz sentido escrever código extra que não será usado.

Gavin Miller
fonte
3

Na minha experiência, realmente depende do software que você está escrevendo. Descobri que é extremamente difícil escrever testes de unidade para uma IU. Eu só uso testes de unidade para partes do sistema que têm uma entrada / saída definida.

Shaun Bowe
fonte
Concordo. Se você usar model / view / controller, faz muito sentido testar a unidade do modelo e do controlador. A IU é quase sempre melhor testada por um humano.
Zan Lynx,
Os testes de componentes são equivalentes à IU dos testes de unidade. Também pode haver testes de unidade de "lógica de negócios" que é usada pela IU. A lógica de negócios, nesse sentido, geralmente é a lógica de apresentação. Onde o teste de IU e o teste de unidade não são compatíveis é na área de renderização e teste da saída renderizada. por exemplo, como vou testar a unidade deste gerador de código QR ou deste gráfico de pizza? A resposta é, com certeza, você não fará um teste de unidade. O teste de instantâneo pode fornecer o valor do teste de regressão nesses casos.
ocodo
3

Sinto falta dos testes de unidade - eles apenas tornam a vida mais fácil.

Isso não é , realmente, um motivo suficiente para uma empresa adotar o teste de unidade.

Uma razão suficiente pode ser "mais barata" (e / ou "melhor"): o que não é tão fácil de provar sobre o teste de unidade.

A única boa razão pode ser "escrever testes de unidade é o melhor uso do tempo dos desenvolvedores", o que é realmente difícil de provar IMO: e pode ser verdade em alguns lugares, para algum software, com alguns desenvolvedores, e não é verdade em outros lugares.

Existem muitos desenvolvedores que não pensam o mundo dos testes de unidade: incluindo alguns que pensam que outras formas de teste (por exemplo, integração automatizada / testes funcionais) podem ser mais baratas e valiosas, por exemplo, Eu sou o único desenvolvedor que não t gosta de testes de unidade?

ChrisW
fonte
3

Claro, no mundo ideal, você não pode argumentar contra ter um teste de unidade.

No entanto, se você escreve um teste de unidade depende de uma série de coisas:

  • Como o software será usado. Se você estivesse escrevendo software apenas para você, escreveria testes de unidade? Provavelmente não. Se você estava escrevendo um software pré-empacotado para ser vendido comercialmente, provavelmente sim.

  • Quantas pessoas mantêm o código ... se for apenas você, então você pode conhecê-lo bem o suficiente para estar confiante o suficiente, após fazer uma alteração, de que uma rápida execução do código é suficiente para garantir que nada foi quebrado. Se outras pessoas que não escreveram o código originalmente precisarem mantê-lo, um teste de unidade ajudará a dar-lhes confiança de que, quando atualizarem o código para corrigir um problema grande (que obviamente não foi capturado no teste de unidade!), Eles não quebraram nada .

  • complexidade do código: teste apenas o código que precisa de um teste. Um método de atribuição de variável de uma linha não precisa de teste. Um método de 50 linhas com vários caminhos de execução provavelmente sim.

  • Considerações comerciais práticas: o fato é que escrever testes de unidade leva mais tempo do que não fazê-lo. Se você está escrevendo um protótipo de software, que tem um futuro comercial incerto, então há uma recompensa a ter entre ter um código rápido, agora, que funcione suficientemente bem contra ter um código testado por unidade em 2 semanas que funcione melhor. Às vezes, vale a pena descobrir rapidamente (apetite do consumidor) se o software terá uma prateleira curta e passar para o próximo projeto.

e como outros apontaram, um teste é tão bom quanto a pessoa que o escreveu.

Joel
fonte
3

O principal motivo é que muitos desenvolvedores e gerentes de desenvolvimento não têm ideia da existência de testes de unidade ou de como usá-los.

A segunda razão é que os testes de unidade só podem ser usados ​​(de maneira sensata) com código que já atenda a alguns padrões de qualidade. As chances são de que alguma base de código existente não se enquadre nessa categoria.

A terceira razão é preguiça e / ou baixo custo.

Erich Kitzmueller
fonte
3

Porque os testes de unidade só são úteis se você escrever código testável. E escrever código testável é difícil. E as pessoas são preguiçosas e / ou baratas.

EDITAR: matizado "preguiçoso" como "preguiçoso e / ou barato"; em raras ocasiões, as pessoas realmente têm a habilidade, a capacidade e a vontade de escrever testes, mas têm outra coisa a fazer que afeta mais diretamente os resultados financeiros.

phtrivier
fonte
Eu votaria a favor, exceto que não acho que as pessoas 'são preguiçosas'. Pense em 'programação', ou seja, 'sua popular linguagem de programação e ferramentas relacionadas, documentos, treinamento, fluxos de trabalho, coisas' nunca foi projetado de uma forma que facilitasse a escrita de código testável. Portanto, para escrever código testável, você sempre precisa ir mais além. Sem recompensa, 'visto que já funciona' naquele ponto (de forma que escrever testes primeiro, código depois, TDD, faça sentido prático). Pense que isso é mais um viés cognitivo que engana não apenas os programadores atuais, mas já enganou os autores das ferramentas de 'programação' que os codificadores agora constroem.
n611x007
1
Sim, claro, às vezes as pessoas são baratas / falidas / têm coisas melhores para fazer (ou, como dizemos educadamente, "temos trocas a fazer"). Editado para refletir isso. (Eu estava prestes a acrescentar que, além disso, a maior parte do código é inútil, então testá-lo também é inútil; mas isso é apenas falta de sono falando;))
phtrivier
2

Acho que parte do problema é que os desenvolvedores esperam que os empresários tenham o mesmo conjunto de valores e realmente se preocupem com a resposta "devemos testar a unidade ou não?". Não obtemos aprovação prévia do negócio para usar uma linguagem de alto nível em vez da linguagem assembly - geralmente é a maneira sensata de fazer o trabalho.

A questão é que somos os únicos qualificados para fazer a chamada (o que não quer dizer que todos nós temos o mesmo conhecimento sobre o assunto). Além disso, mesmo que sua equipe não faça, por uma questão de política, testes de unidade (ou nomeie seu método do dia), geralmente não significa que você não possa fazê-lo.

A verdade é que não podemos realmente provar o ROI na maioria das coisas que fazemos com uma granularidade muito fina. Por que o teste de unidade é realizado de acordo com esse padrão de prova irracional / atípico está além da minha compreensão ...

Jeff Kotula
fonte
Você precisa de gerenciamento envolvido, entretanto, porque você tem que ter seus co-desenvolvedores a bordo e a melhor maneira para que isso aconteça é sendo um requisito de cima para baixo.
João
2

As pessoas são preguiçosas e só adotam mudanças quando são forçadas.

caçador
fonte
2

Meus 2 centavos:

  • Requer alguma educação e disciplina, mas os recém-formados já vêm com o conhecimento adequado.
  • A sobrecarga de testes pode ser reduzida com ferramentas melhores e isso também está acontecendo (refatoração etc.)

Então, é só questão de tempo.

Há o debate Martin-Coplien em que Bob Martin afirma que:

"hoje em dia é irresponsável um desenvolvedor lançar uma linha de código que ele não executou em um teste de unidade."

[ http://www.infoq.com/interviews/coplien-martin-tdd]

robi-y
fonte
2
Não acredito na existência de um sistema complexo do mundo real no qual cada linha de código foi coberta por testes de unidade.
quant_dev
2

Se você quiser convencer todos sobre o teste, faça o seguinte:

  1. Escreva um monte de testes.
  2. Notifique os outros desenvolvedores que alterarem o código e falharem no (s) teste (s).
  3. Eles vão consertar seu código.
  4. Agora você pode lançar sem esses bugs específicos.

Até mesmo um gerente poderia entender isso.

JeffO
fonte
O teste de unidade não fará com que sua versão esteja livre de erros. Isso pode reduzir a contagem de bugs, mas é extremamente difícil medir o número de bugs que / não atingiram a produção por causa do teste.
Tom
Não sei se a gerência ficaria feliz com alguém escrevendo um monte de testes quando poderia estar codificando novas funções. Se eles não concordarem com o TDD, você provavelmente terá problemas por escrever testes para cobrir o código que não escreveu.
jcollum de
@jcollum Como de costume, depende da relação custo / lucro.
quant_dev
2

As empresas não estão realizando testes de unidade, pelo mesmo motivo que muitos sites são mal escritos - ignorância e pessoas aderindo a velhos hábitos. Na minha empresa, desde que começamos os testes de unidade (com Nunit e Typemock ), alcançamos maior cobertura de código e lançamos o software em um tempo menor para o mercado.

Steve_0
fonte
2

Como a maioria das boas ideias, a adoção tem mais a ver com a dependência do caminho organizacional do que com a qualidade da ideia.

Na maioria das empresas que enviam produtos, uma divisão de QA substancial foi criada com um chefe de QA de nível sênior. O teste é o feudo da equipe de QA.

É improvável que a equipe de QA escreva o código de teste de unidade porque a empresa normalmente não compõe a equipe de QA com seus codificadores de serviço pesado.

A equipe de programação reluta em escrever o código de teste porque isso cria um conflito com a equipe de QA.

Tenho visto mais interesse e adoção de testes de unidade em grupos onde o controle de qualidade não foi dividido em uma função de trabalho separada

zmanian
fonte
1

Simples, custa dinheiro escrever e atualizar testes de unidade. A maioria dos softwares anteriores das empresas não tem testes de unidade e custará muito para escrever. Então, eles não fazem isso e isso aumenta o tempo do processo de desenvolvimento, então eles também não o adicionam a novos recursos.

David Basarab
fonte
Você deve ler os links sobre ROI.
jcollum de
1

A maioria das empresas é inútil. Não aquele para o qual você (ou eu) trabalhamos, obviamente.

Roger Lipscombe
fonte
Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos de um autor, deixe um comentário abaixo de sua postagem.
AlexVogel
P: "Por que mais empresas não estão fazendo [testes de unidade]?" R: "Porque a maioria das empresas é inútil." Parece uma resposta para mim ...
Roger Lipscombe