Você usa testes de unidade no trabalho? Que benefícios você obtém deles? [fechadas]

18

Eu tinha planejado estudar e aplicar testes de unidade ao meu código, mas depois de conversar com meus colegas, alguns deles me sugeriram que não é necessário e que possui um benefício muito pequeno. Eles também afirmam que apenas algumas empresas realmente fazem testes de unidade com software de produção.

Estou curioso para saber como as pessoas aplicaram o teste de unidade no trabalho e quais os benefícios que obtêm ao usá-los, por exemplo, melhor qualidade do código, menor tempo de desenvolvimento a longo prazo, etc.

Anônimo
fonte
13
"Eles também afirmam que apenas poucas empresas fazem testes de unidade com software de produção". Isso significa que apenas algumas empresas produzem software de alta qualidade. Com qual grupo você deseja se alinhar? Como "apenas algumas empresas" podem ser uma afirmação negativa? Apenas algumas empresas são extremamente lucrativas; isso faz mal? Apenas algumas empresas são lugares realmente agradáveis ​​para trabalhar; isso faz mal? Apenas algumas empresas minimizam a criação de resíduos; isso faz mal? O comentário de "apenas algumas empresas" não faz sentido.
S.Lott
2
provavelmente também está incorreto, anedoticamente, ainda não trabalhei para ou com uma empresa que não fez pelo menos algum nível de teste de unidade
jk.
1
Eu diria que um programador que acha que o teste de unidade "tem um benefício muito pequeno" é inexperiente ou simplesmente não sabe como escrever testes de unidade eficazes.
Toby
Quanto teste de unidade os desenvolvedores deste site usam?
Jeffo
1
@ S.Lott: sem sentido sim, ainda assim, ainda é usado como argumento para não fazer o teste de unidade por aqueles que não querem fazê-lo. Não estou defendendo o ponto de vista deles aqui, pelo contrário. No entanto, essa afirmação ainda é feita e aqueles que a fazem estão convencidos de seu valor e, uma vez que são elas, devemos convencer dos benefícios reais de testá-la porque ela não tem sentido, não vai ajudar muito a causa maior.
Newtopian

Respostas:

20

alguns deles me sugerem que não é necessário

Bem, no sentido estrito, eles estão certos: testes, revisões de código, controle de origem etc. também não são estritamente necessários . Apenas muito poucos desenvolvedores sensíveis trabalham sem eles a longo prazo. Muitos de nós aprendemos (geralmente da maneira mais difícil, com nossos próprios erros) por que essas são as melhores práticas.

e tem um benefício muito pequeno.

Isso não é verdade na maioria dos casos. Ou seja, se estamos falando de software de produção que deveria estar em uso - portanto em manutenção - nos próximos anos.

Eles também afirmam que apenas poucas empresas fazem testes de unidade com software de produção.

Isso pode ser verdade (embora na minha experiência cada vez menos), mas não há nada a dizer sobre o valor do teste de unidade. Em contraste, a velha piada "Merda é boa - 50 bilhões de moscas não podem estar erradas!" ;-)

você aplicou o teste de unidade em seu trabalho e o que você obtém dele? (por exemplo, melhor qualidade do código, reduzir o tempo a longo prazo etc.)

Venho aplicando testes de unidade em meu trabalho, sempre que possível, há mais de 10 anos. Esse sentimento de confiança no meu código, sabendo que ele funciona - e eu posso provar a qualquer momento, em qualquer lugar, em alguns segundos, repetidas vezes, em vez de apenas acreditar nele - não tem preço. Isso me dá a coragem de refatorar meu código, melhorar seu design ou corrigir bugs, sem o medo de quebrar a funcionalidade existente. Eu nunca voltaria aos velhos tempos de "codifique e ore".

Péter Török
fonte
14

Eu faço unittests, mas não (ou poucos) no trabalho

Os principais benefícios dos testes obtidos são que a refatoração é muito mais fácil e a regressão (ou seja, reintrodução de erros já corrigidos) é notada.

Testar vidas com 'a compilação': você faz o check-out do software com testes em execução e não faz check-in até que todos os testes estejam em execução com sua modificação.

Então, na minha experiência, escrever testes é quase inútil quando feito de um lobo solitário. Quando você sempre precisa corrigir seus testes para acomodar as alterações feitas pelos outros, quando os testes podem ser excluídos por seus colegas de trabalho (ocorreram em meus trabalhos anteriores) porque 'eles não me deixam implantar', etc., eles são apenas um trabalho extra com os benefícios queimados instantaneamente pelo resto da equipe.

Quando toda a equipe concorda (e, em uma equipe de 1 que é fácil), na minha experiência, os testes são um grande benefício para a qualidade, estilo e robustez do projeto.

Mas em uma equipe que acredita honestamente que "apenas algumas empresas testam seu código automaticamente" e estão convencidas de que são uma perda de tempo de qualquer maneira, parece haver pouca esperança de obter os benefícios, mas há uma grande possibilidade de você conseguir responsável pela 'perda de tempo' ao apontar erros.

A melhor chance de introduzir testes seria um pequeno projeto sob sua exclusiva responsabilidade. Lá você teria a oportunidade de brilhar e demonstrar o valor dos testes.

keppla
fonte
1
Desculpe por parecer negativo, mas ainda estou queimado por 'como fazer as coisas como um grunhido';)
keppla
Muito bom conselho. O problema é que, quando bem feito, você não vê o benefício do teste de unidade. Você só vê o dano potencialmente quando não faz testes de unidade. Portanto, se você precisa convencer os outros com estatísticas, em vez de teoria, você está muito ferrado.
Peter Kruithof
12
@keppla, venho escrevendo testes de unidade em projetos em que meus colegas de equipe nem ouviram falar em testes de unidade antes. Depois que meus testes conseguiram detectar alguns bugs que, de outra forma, teriam passado despercebidos, os outros começaram a perceber e logo queriam aprender eles mesmos os testes de unidade. A evidência concreta é rei.
Péter Török
1
@keppla, é justo, se os colegas de equipe estão tendenciosos ao ponto de perder o bom senso, não há como convencê-los por provas lógicas :-( Nesse caso, com um forte suporte de gerenciamento, você ainda poderá levar a idéia adiante. , mas sem isso, não há esperança.
Péter Török
3
Você 'quebra' os testes frequentemente alterando a interface, removendo as Classes, etc. Quando você faz o 'teste primeiro', você não vê isso como 'quebra', mas como o primeiro passo 'Vermelho'. Mas quando você está na mentalidade 'Basta adicionar algumas linhas até que funcione', os testes são apenas mais linhas. E quando "consertados" por alguém como esse, os testes tendem a se degradar em utilidade, até que realmente não servem para nada. Profecia Selffulfilling 4tw!
keppla 30/06
7

Costumo ficar do lado de seus colegas, mas até certo ponto.

O problema dos testes de unidade é que eles são escritos com frequência e sem pensar em casos triviais, nos quais a investigação superficial do código revela que ele funcionará, não importa o quê. Por exemplo:

def add(x, y)
  x + y
end

Juntamente com uma dúzia de testes para garantir que a adição funcione de fato para casos de uso escolhidos arbitrariamente. Duh ...

A premissa geral por trás do teste de unidade é: se o seu código não contém bugs, é porque você não testou o suficiente. Agora, quando escrever testes de unidade adequados. Respostas:

  1. Quando você está testando
  2. Quando você está depurando
  3. Como você está desenvolvendo coisas realmente difíceis

Vamos analisar cada um, supondo que você esteja desenvolvendo algum tipo de aplicativo da web.

Você escreve algum código para a nova funcionalidade, e deve funcionar razoavelmente bem até agora. Você acessa seu navegador e verifica se ele funciona testando com mais intensidade, certo? Bzzzt! ... Resposta errada. Você escreve um teste de unidade. Se você não fizer isso agora, provavelmente nunca o fará. E este é um dos lugares onde os testes de unidade funcionam muito bem: para testar funcionalidades de alto nível.

Você descobre um bug (quem nunca perde nenhum?). Isso nos leva ao ponto dois. Você volta ao código e começa a seguir as etapas. Enquanto isso, escreva os testes de unidade nos principais pontos de interrupção, onde é essencial ter dados consistentes e corretos.

O último ponto é o contrário. Você está projetando algumas funcionalidades peludas que envolvem muita meta-programação. Ele gera rapidamente uma árvore de decisão com milhares de cenários em potencial, e você precisa garantir que cada um deles funcione. Ao escrever essas coisas, uma simples mudança de aparência aqui ou ali pode ter consequências inimagináveis ​​na cadeia alimentar. Digamos que você esteja projetando uma implementação MPTT usando gatilhos SQL - para que ele possa trabalhar com instruções de várias linhas.

Nesse tipo de ambiente espinhoso, normalmente você deseja automatizar altamente seus testes. Então, você escreve scripts para automatizar a geração de dados de teste e executa uma carga de testes de unidade nesses dados de teste. Uma coisa crucial a não perder de vista ao fazer isso é que você também precisa escrever testes de unidade para o seu gerador de testes de unidade.

Conclusão: testes de unidade, definitivamente sim. Mas poupe-se das funcionalidades básicas - até que você realmente precise delas para depuração ou para garantir que alguma funcionalidade peluda funcione corretamente (incluindo, neste último caso, os próprios testes).

Denis de Bernardy
fonte
Como Kent Beck colocou: "teste tudo o que poderia quebrar".
Péter Török
1
Concordando sinceramente com ele. Minha principal esperança é que o OP tome nota: não se esqueça de testar os testes, quando aplicável. :-)
Denis de Bernardy
7

Todo o código deve ser testado. Não há escolha sobre isso.

O código não testado é inútil: não se pode confiar em nada para fazer nada.

Você pode escrever testes de unidade ou pode esperar escrever testes de integração de nível superior ou testes de aceitação.

Os testes de unidade são mais fáceis de escrever, mais fáceis de depurar e mais fáceis de gerenciar.

Os testes de integração são baseados em suposições de que as unidades realmente funcionam. Sem testes de unidade, como você sabe que as unidades funcionam? Como você pode depurar um teste de integração se não conhece as unidades individuais que estão sendo integradas realmente funcionam?

Testes de aceitação, da mesma forma, dependem de todas as peças e peças funcionando. Como você pode saber que as peças e peças funcionam sem ter um conjunto de testes de unidade?

O teste é obrigatório. Todos os testes de nível superior dependem das unidades realmente funcionando.

Isso faz do teste de unidade uma necessidade lógica. Não há outra escolha.

S.Lott
fonte
1
Não há outra escolha ... se você se preocupa com a qualidade. A maioria das organizações de software não se preocupa genuinamente com a qualidade (na medida em que se recusa a enviar o software que está quebrado).
Joeri Sebrechts
@ Joeri Sebrechts: Não é um problema de qualidade. É um problema "está pronto". Mesmo software ruim precisa ser testado para provar que faz alguma coisa - qualquer coisa. A lógica simples determina que deve haver um teste para provar que funciona. Mesmo um teste ruim é um teste. A lógica simples determina que um teste do todo deve incluir testes das partes. O teste de unidade é simplesmente exigido pela lógica, nada mais. Não considerações de qualidade, mas por definição de "concluído".
S.Lott 01/07
1
Usar o software é um teste por si só. Muitas organizações estão felizes em fazer o usuário fazer o teste. Não estou dizendo que isso é uma coisa boa, mas é assim. Você pode optar por não testar antes da entrega, descarregando o teste para o usuário final. Você pode, mas não deveria.
Joeri Sebrechts
1
@ Joeri Sebrechts: Na verdade, você não pode. Você não pode entregar o software - aleatoriamente - para um usuário para teste de aceitação. Você deve ter executado o software pelo menos uma vez para garantir que ele funcionou. Isso é um teste - um teste ruim - mas um teste. Logicamente, esse teste ruim incorporou testes de unidade ruins. Eles existiram, apesar de serem muito ruins.
S.Lott 4/07
sua definição de teste de unidade é inútil para esta discussão. Um teste de unidade é um teste codificado e que não é necessário para o envio de software. (mas é bom fazer em muitas circunstâncias) #
Martin Ba
6

Uso testes de unidade para tudo o que escrevo e não deixo nenhum código não testado passar na revisão sem um caso de teste. (Mas como eu não tenho uma ferramenta de cobertura, preciso raciocinar sobre a cobertura do teste. Uma coisa de cada vez ...)

É bem simples: se você não consegue demonstrar que seu código funciona (e de que maneira melhor do que uma especificação executável na forma de um teste?), Ele não funciona .

Isso me dá:

  • Tranquilidade: meu servidor de CI me diz que toda a minha base de código funciona.
  • A capacidade de melhorar meu código: eu posso reestruturar meu código - refatorá-lo - sabendo que após a reestruturação eu não quebrei nada.
Frank Shearar
fonte
2
Eu acrescentaria uma ressalva muito importante a isso - o teste de unidade por si só não garantirá que "toda a sua base de código funcione". Ele irá garantir que todas as unidades de código funcionam isoladamente, mas ainda há uma enorme possibilidade de erros de integração, os erros na apresentação visual de dados, etc.
Ryan Brunner
A menos que seu ambiente passe "se você não puder demonstrar que seu código não funciona, então funciona". : p
Davy8
@ Ryan: Obviamente, seus testes de integração devem conduzir o projeto inteiro. A pergunta era sobre testes de unidade, então eu falei sobre testes de unidade, mas é claro que você deve demonstrar a necessidade de um pedaço de código tendo um teste de integração com falha. E, claro, você deve ter um servidor de CI implantar automaticamente sua base de código e correndo todos testsl
Frank Shearar
@ Davy8: Nesse caso, você tem problemas mais sérios que "os testes de unidade funcionam?".
18775 Frank Shearar
4

O teste de unidade é uma disciplina. Como não é necessário que o código funcione, ele geralmente é descartado.

É, no entanto, um método comprovado que leva a um código robusto e com menos erros. Acho que não preciso explicar os benefícios para você, como você já mencionou. Se você observar alguns dos principais projetos de código aberto, sejam bibliotecas javascript, estruturas de pilha completa ou aplicativos de uso único, todos eles usam testes de unidade.

Eu suspeito que seus colegas que recomendam não usá-lo não são programadores. Se forem, digamos que não há muitas pessoas que eu valorizo ​​mais do que pessoas como Martin Fowler ou Kent Beck ;).

Como a maioria das melhores práticas, os benefícios são de longo prazo, você precisa investir algum tempo nisso. Você pode escrever um longo script de código processual, mas todos sabemos que você deseja que o tenha escrito em estilo orientado a objetos quando precisar refatorá-lo após 2 anos.

O mesmo vale para o teste de unidade. Se você escrever testes de unidade para peças críticas em seu aplicativo, poderá garantir que ele funcione conforme o esperado, o tempo todo, mesmo após a refatoração do código. Talvez você codifique tão bem que nunca tenha um erro de regressão. Mas se você não o fizer, ou se um novo programador se juntar à sua equipe, você deseja garantir que os erros do passado não aconteçam novamente. Eu acho que seu chefe também ficaria feliz com isso, em vez de ter que registrar um relatório de bug que ele pensava ter sido resolvido meio ano atrás.

Peter Kruithof
fonte
3

Os testes de unidade requerem linguagem amigável para teste de unidade, design amigável para teste de unidade e problema amigável para teste de unidade.

C ++, design multithread e GUI serão um pesadelo, e a cobertura do problema será assustadora.

.NET, assembly dll single-threaded reutilizável, pura lógica computacional será uma brisa.

Vale a pena, eu realmente não posso dizer.

Você refatorou muito? Você vê "bugs estúpidos" como "off one" no seu código?

O que quer que você faça, não seja aquele cara que critica os outros por "você não tem testes de unidade; portanto, você é péssimo". Se os testes o ajudarem, tente, se não, não é como se fossem uma bala de prata.

Codificador
fonte
1
Por que o design multithread seria um pesadelo? Crie pontos de sincronização e teste lá.
Frank Shearar
1
Porque o tempo depende das fases da lua, relógio da CPU, lixeira e praticamente qualquer coisa. Em um check-in, o teste pode falhar, se você tiver sorte, em outros 1000, não.
Coder
1
Eu escrevi coisas multithreaded test-driven. É definitivamente factível.
Frank Shearar
4
lixo, você pode fazer o teste de unidade em qualquer idioma.
jk.
1
É difícil escrever testes de unidade para interações da GUI, mas é por isso que isolamos qualquer coisa (nosso código do mecanismo) que não tenha relação com a GUI. Isso nos ajudou a tomar uma boa decisão de separar o mecanismo da GUI, além disso, os testes de unidade atuam como nossa interface no lugar da GUI, solicitando e fornecendo as informações que normalmente precisaríamos.
Chance
3

Eu quero , mas tive o infortúnio de trabalhar quase inteiramente em empresas que simplesmente não se importam com a qualidade e estão mais concentradas em jogar lixo juntos que meio que talvez funcione. Eu mencionei testes de unidade e recebo um "Hein?" tipo de aparência (a mesma aparência quando menciono os princípios SOLID , ou ORMs, ou padrões de design além de "classe com todos os métodos estáticos" ou seguindo as convenções de nomenclatura do .NET). Eu só estive em uma empresa que entendeu essas coisas e, infelizmente, era um contrato de curto prazo e o departamento foi cortado para cortar custos, para que não houvesse tempo suficiente para realmente aprender.

Eu me envolvi em testes de unidade em projetos fictícios descartáveis, mas não entendi muito bem o TDD / BDD completo, e não ter um mentor que possa ajudá-lo torna muito mais difícil fazer isso corretamente.

Wayne Molina
fonte
2

Nos os utilizamos. Um grande benefício que obtemos é que nossa estrutura de teste de unidade verifica se há vazamentos de memória e falhas de alocação . Às vezes, o problema está no próprio código de teste da unidade, mas geralmente no código de produção.

É uma ótima maneira de encontrar as coisas que são perdidas em uma revisão de código.

Os testes de unidade (devem) também são executados muito rapidamente e podem ser executados como parte do seu integração contínua após cada confirmação, e também pelos desenvolvedores antes da confirmação. Temos mais de 1.000 que levam menos de 20 segundos para serem executados.

Compare com mais de 40 minutos para testes de automação no nível do sistema e horas / dias para testes manuais. Obviamente, os testes de unidade não são os únicos testes que você deve fazer, mas em um nível de código refinado, eles podem ajudar a encontrar bugs e testar os casos extremos que os testes de sistema / integração não podem tocar. Nosso código deve ser testado com mais de 75% de cobertura de decisão e 100% de cobertura de funções, o que seria muito difícil de obter sem testes de unidade.

Hugo
fonte
2

Eu diria que os testes de unidade agregam valor, mas não sou um grande discípulo de TDD. Eu encontro o maior benefício com os testes de unidade quando faço o cálculo de motores, ou qualquer tipo de mecanismo realmente e depois as classes de utilidade; os testes de unidade são muito úteis.

Eu prefiro testes de integração automatizados para os blocos mais dependentes de dados, mas tudo depende, eu estou no negócio de dados, então muitos erros são mais dados relacionados em nosso ambiente do que qualquer outra coisa, e para isso os testes de integração automatizados funcionam bem. Verificando os dados antes e depois e gerando relatórios de exceção a partir desses testes.

Portanto, os testes de unidade realmente agregam valor, especialmente se a unidade que você está testando puder ser fornecida com todas as entradas necessárias e funcionar sozinha com a entrada fornecida. Novamente, no meu caso, os mecanismos de cálculo e as classes de utilidade são exemplos perfeitos.

Marthinus
fonte
2

Custos: código mais lento, curva de aprendizado, inércia do desenvolvedor

Benefícios: Geralmente, eu me pude escrever um código melhor quando testei pela primeira vez - em relação ao SOLID ...

Mas o IMHO, o maior benefício que penso, é a confiabilidade em sistemas maiores que mudam com frequência. Um bom teste de unidade salvará o seu alvo (o meu) quando você libera várias versões e pode eliminar uma grande parte dos custos associados aos processos manuais de controle de qualidade. É claro que não garante código livre de bugs, mas pega alguns códigos difíceis de prever. Em grandes sistemas complexos, isso pode ser um benefício muito grande.

Bob_Mac
fonte
0

Faço alguns testes de unidade no trabalho quando tenho a chance e tento convencer meus colegas a fazer o mesmo.

Eu não sou religioso sobre isso, mas a experiência mostra que os métodos de utilidade e de negócios que foram testados em unidade são muito robustos e tendem a ter poucos ou nenhum erro aparecendo durante a fase de teste, o que no final reduz os custos no projeto.

Philippe
fonte
0

Onde vi a vantagem real de codificar testes de unidade e tornar a execução de testes de unidade parte do processo diário de criação foi em um projeto com mais de 30 desenvolvedores trabalhando em 3 continentes diferentes. Onde os testes de unidade realmente brilhavam era quando alguém mudava sutilmente uma classe que mantinham sem entender como as pessoas estavam usando essa classe. Em vez de esperar o código chegar ao grupo de testes, houve um feedback imediato quando os testes de unidade de outras pessoas começaram a falhar como resultado da alteração. [É por isso que todos os testes de unidade precisam ser executados rotineiramente, não apenas os que você escreveu para o seu código.]

Minhas diretrizes para testes de unidade são:

  1. Teste todas as condições possíveis para o seu código, incluindo entradas, limites incorretos etc.
  2. Todos os testes de unidade para todos os módulos devem ser executados regularmente (ou seja, como parte das construções noturnas)
  3. Verifique os resultados do teste de unidade!
  4. Se alguém encontrar um erro no seu código que passou nos testes, escreva um novo teste para ele!
jwernerny
fonte
0

Eu aprendi recentemente TDD e acho que é muito útil. Dá maior confiança de que meu código esteja se comportando como eu esperava. Além de facilitar qualquer re-fatoração que eu gostaria de fazer. Sempre que um bug é encontrado, você pode garantir que, através do teste, ele não apareça novamente.

A parte mais difícil é escrever bons testes de unidade.

É uma boa referência para o seu código.

Schleis
fonte