Como você tornou o teste de unidade mais agradável? [fechadas]

18

Se você sempre gostou de testar a unidade, bom para você! Mas para os infelizes que não nasceram com gosto por isso, como você conseguiu tornar essa tarefa mais agradável?

Esta não é uma pergunta "qual é o caminho certo para o teste de unidade". Eu simplesmente quero conhecer pequenos truques pessoais que reduzem o tédio (ouso dizer) de escrever testes de unidade.

Preets
fonte
1
Eu adoro escrever testes de unidade e outros testes, em parte porque quase todo mundo é péssimo nisso (às vezes eles também são péssimos em criar ferramentas que estou testando). Não, eu não sou péssimo como desenvolvedor. Eu gosto de usabilidade, colírio para os olhos e automação. A MbUnitbiblioteca mudou minha vida. O teste automático é importante. O teste automático economiza tempo. O teste automático economiza dinheiro. O teste automático pode salvar vidas. O teste automático é o único caminho. O teste automático é mais uma rede de segurança. Quando sou uma das 50 pessoas trabalhando em uma arquitetura enorme, sinto-me como mais um tijolo na parede. Com testes unitários, estou no controle.
Job
Preguiça e frustração no teste de unidade são uma reação normal ao trabalho que nosso cérebro considera inútil. Detesto escrever e manter testes de unidade com pouco ou nenhum retorno sobre o investimento. No entanto, escrever testes úteis é uma tarefa agradável, mas é uma habilidade por si só reconhecer o que é útil e o que é lixo. Há um cara que está escrevendo um livro sobre esse tópico com base em seu blog, e pode
começar a

Respostas:

22

Em primeiro lugar, concordo com você - se você está escrevendo seus testes de unidade em código já concluído, ou você está testando manualmente seu código, acho isso extremamente chato também.

Acho que existem duas maneiras de testar a unidade para mim que realmente a tornam agradável:

  1. Ao usar o Test Driven Development (TDD) - escrever os testes primeiro me permite pensar na próxima parte da funcionalidade ou comportamento que eu preciso no meu código. Acho que dirigir em direção ao meu objetivo final em pequenos passos e ver progressos tangíveis em direção a esse objetivo a cada poucos minutos são extremamente gratificantes e agradáveis.
  2. Quando há erros, em vez de ir direto para o depurador, é um desafio divertido descobrir uma maneira de escrever um teste de unidade com falha que reproduz o erro. É extremamente satisfatório finalmente descobrir as circunstâncias que fazem o seu código falhar, corrigi-lo e observar a barra ficar verde para o novo teste com falha (e permanecer verde para todos os testes existentes).
Paddyslacker
fonte
12

Superioridade presunçosa.

Estou apenas brincando. "Olhe para mim, cultivando bons hábitos de programação! Esse material de 'teste de unidade' nunca foi feito por mim de dez anos atrás - que idiota! E pense em todos os bugs que vou pegar como resultado de esse trabalho chato e tedioso que estou fazendo agora - meu código será incrível! Receberei um aumento com certeza! * "

* - Não, não vou.

Acho que é como malhar ou comer de forma saudável; até que os benefícios tangíveis realmente apareçam ("Puxa vida, eu realmente estou pegando uma porcaria de erros de regressão que entrariam na produção!"), o orgulho moral de saber que você está fazendo a coisa certa pode ajudar a carregá-lo através.

BlairHippo
fonte
7

Por um lado, eu quase nunca sento e escrevo testes de unidade. Os testes de unidade são um meio para um fim, não um fim em si mesmos. Eles são uma maneira de responder "esse código faz a tarefa básica que deveria".

Por exemplo, algumas pessoas escrevem uma função e, em seguida, abrem uma sessão interativa para testá-la em alguns valores e verificar se está funcionando:

def fact x
  if x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact 10
=> 3628800
>> fact 7
=> 5040

Mas agora você descobre um bug:

>> fact -1
SystemStackError: stack level too deep
    from (irb):2:in `fact'
    from (irb):5:in `fact'
    from (irb):10

Então você conserta:

def fact x
  if x < 0
    raise "Can't take the factorial of a negative number"
  elsif x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact -1
RuntimeError: Can't take the factorial of a negative number
    from (irb):3:in `fact'
    from (irb):10

Mas agora você realmente deve testar para garantir que ainda funcione:

>> fact 10
=> 3628800
>> fact 7
=> 5040

Como você pode ver, você continua repetindo os mesmos testes ... e precisa comparar os resultados visualmente. O teste de unidade é uma maneira de evitar a repetição neste caso; reduz quanto trabalho você precisa fazer. E embora este seja um pequeno exemplo bobo, no mundo real, torna-se cada vez mais importante e cada vez mais difícil testar manualmente. O que isso significa, é claro, é que as pessoas simplesmente não testam os componentes individuais; eles apenas testam o programa inteiro. Mas então surgem erros, e eles são muito mais difíceis de encontrar. Ou ocorrem erros e são corrigidos, mas alguém introduz o mesmo erro novamente, porque ninguém adicionou um caso de teste para garantir que isso não acontecesse. Ou alguém analisa um grande pedaço de código e diz: "Não faço ideia do que isso deve fazer, pois não está documentado e não possui testes ... se eu corrigir esse bug, não faço ideia se vou quebrar outra coisa dependendo dele; talvez eu apenas reescreva isso do zero. "

Os testes de unidade reduzem todo o trabalho extra nesses casos. A melhor maneira de torná-los divertidos é garantir que as pessoas entendam todo o trabalho que estão substituindo e a flexibilidade extra resultante de saber o que cada parte do código deve fazer. Até certo ponto, as pessoas precisam ter um pouco mais de experiência em escrever e manter uma grande base de códigos para entender o quão importante o teste de unidade pode ser; se todo o código deles for algo que eles escrevem uma vez e jogam fora, eles nunca o entenderão.

E os testes de unidade não devem ser escritos após o fato, como uma tarefa extra depois que você tiver um código que "sabe" que já funciona. Os testes de unidade devem ser escritos primeiro ou, no mínimo (desde que você às vezes se esqueça de escrevê-los primeiro) logo após escrever o código em questão. Isso se chama desenvolvimento orientado a teste e pode ajudar a melhorar suas APIs; se você escrever os testes que exercitam as APIs primeiro, aprenderá onde as APIs são difíceis de usar antes de escrever o código e poderá reprojetar muito mais facilmente do que se você apenas adicionasse os testes posteriormente.

Brian Campbell
fonte
@ Biran, eu concordo. Mas tudo isso faz com que seja a coisa "certa". Mas como se torna agradável? Mesmo um pouco?
Preets 9/09/10
@Preets É divertido porque você está evitando fazer testes manuais repetitivos. É mais agradável quando você faz isso primeiro , em vez de depois do fato, porque ele se torna parte do processo de design, não uma tarefa posterior ao fato do código que já "funciona".
Brian Campbell
Então, gaste algum tempo fazendo mal, para que fazer o certo seja divertido em comparação? ... Isso pode funcionar, na verdade ....
BlairHippo
@Biran, eu concordo, é preciso fazê-lo "primeiro" - não apenas para eliminar o tédio, mas suponho que É a maneira correta de fazê-lo para colher os verdadeiros benefícios dos testes de unidade.
Preets
@ Biran, obrigado! Recentemente, usei o TDD em um projeto meu e mudou a maneira como penso sobre o teste de unidade.
Preets
5

Eu não sei. O que definitivamente torna o teste de unidade mais agradável para mim é o pensamento de toda a depuração frustrante, demorada, chata e sem recompensa que não passarei toda vez que fizer uma alteração no software :)

back2dos
fonte
2
Isso é interessante. Porque, pessoalmente, quando alguém encontra um bug no meu código, enterro minha cabeça com vergonha, mas, ao mesmo tempo, o processo de depuração para mim é realmente muito divertido e muito mais divertido que o teste de unidade. É como resolver um quebra-cabeça em que você precisa pegar esse bug furtivo.
Preets 9/09/10
@ Preets: Eu concordo, às vezes pode ser divertido, mas para mim, o design é muito mais interessante do que a implementação. Portanto, não gosto de gastar muito tempo na implementação. Prefiro que seja direto e previsível, principalmente porque permite fazer agendas mais confiáveis. Por mais que eu goste do processo de criação de software, acho que o resultado é decisivo.
back2dos 9/09/10
Oh, eu concordo completamente! Um sistema com erros aleatórios pode causar noites sem dormir ... minha escolha foi simplesmente uma preferência em um mundo irreal, onde nada além de diversão importava!
Preets
3

A superioridade presunçosa que você sente ao fazer o check-in de um código sólido, robusto e estável. E se você escrever testes de unidade com uma ferramenta de cobertura de código, poderá se gabar nos comentários de que sua cobertura de código é 90% ou superior.

C Johnson
fonte
3

Obviamente, há a satisfação do desenvolvimento do primeiro teste e a sensação que você tem quando o design e os testes se juntam. No entanto, escrever testes para código pré-existente / legado pode ser entorpecedor e frustrante. Quando nosso projeto estava em um padrão de manutenção, escrevi testes para código não testado usando o relatório de cobertura como um jogo. Você pode criar um pouco de concorrência com você e / ou outras pessoas para aumentar os números de cobertura. Concedido, você pode ir longe demais e criar alguns testes ruins, mas pode ser um bom motivador.

Matt H
fonte
como o código legado geralmente não é facilmente testável, eu me esforço para escrever bons testes de unidade - não apenas o processo é doloroso, mas o resultado (testes de unidade) também não é particularmente útil: - / acho isso mais frustrante. Embora o jogo de cobertura seja bom :)
Preets 11/11
1

Tente entrar no fluxo . Defina metas difíceis, mas alcançáveis ​​para si mesmo. Qual poderia ser um objetivo no teste de unidade? Por exemplo, tente escrever mais rapidamente, mantendo a qualidade. Os testes de unidade não requerem muita reflexão, portanto é improvável que haja erros. Concentre-se em seu objetivo e verifique com frequência para ver como está se aproximando.

Tamás Szelei
fonte
ás, por que você diz que o teste de unidade não requer muito pensamento? Se você trabalha com TDD, isso envolve muito pensamento. Isso não é verdade?
Preets
Você está certo, eu não levei em consideração o TDD.
Tamás Szelei
0

Às vezes, para me motivar, anotarei minha "cobertura de código" atual no início do dia. Então, cada vez que escrevo um teste e o passo a passo é executado, vou executar o pacote e atualizar o número da cobertura. É divertido e ajuda a me lembrar por que estou fazendo isso. (Existem outras razões também, mas eu gosto dos números. Talvez seja apenas eu!)

Marcie
fonte
0

Ao não tentar me iludir, posso enganar minha mente, pensando que o teste de unidade pode ser agradável por qualquer período sustentável de tempo.

Aceitar a realidade de que o teste de unidade não existe para ser apreciado me ajuda bastante, fazendo-me perceber que estou procurando algo em um lugar onde nunca deveria estar.

Nessas breves excursões mentais, quando chego ao ponto de perceber que o teste de unidade é o que realmente é, ou seja, uma tarefa cruel, insuportavelmente aborrecida e esmagadora de alma, pergunto-me se posso me dar ao luxo de abandoná-lo, ou seja, não ter altas garantias sobre correção funcional.

Invariavelmente, a resposta é um retumbante "não".

Ao aceitar meu destino, continuo empurrando esses objetos quadrados com letras, números e símbolos na frente de mim, que chamamos de teclado, sabendo por experiência em primeira mão que com cada clique no teclado, o final do teste de unidade está mais próximo do que ele tem sempre sido.

bugfoot
fonte
Nem todo teste é bom ou útil. Isso é algo que os TDD'ers e outros evangelistas de teste geralmente não mencionam. Aposto que em alguns raros momentos você gosta de testar a unidade quando sabe que ela testa lógica complexa, o teste é elegante e não está associado à implementação, e odeio quando você é forçado a testar porcaria trivial apenas para atingir algum objetivo de cobertura de código lunático exigido por diretrizes do projeto.
KolA
@KolA Você está certo que existem testes de unidade desafiadores que exigem criatividade, mas escrever testes de unidade sem fim pode sugar a alegria até mesmo dos que são naturalmente interessantes.
bugfoot