Como desenvolvedor profissional, é aceitável não escrever testes de unidade? [fechadas]

9

Apenas pensando nos prós e contras do TDD / teste de unidade automatizado e procurando a visão da comunidade sobre se é aceitável para desenvolvedores profissionais escrever aplicativos sem oferecer suporte a testes de unidade?

David Osborne
fonte
7
Você já tentou ou está procurando desculpas para não?
3
Então a resposta é "depende do que aqueles que pagam você querem que você faça".
3
@Flores "tem que" - bem, não, não necessariamente. Para um exemplo contrário, veja como a JWZ lançou o navegador Netscape em 1994. jwz.org/blog/2009/09/that-duct-tape-silliness . Eles não tiveram tempo para isso e os testes de unidade geralmente não são recompensados ​​até que você atinja o modo de manutenção.
4
Independentemente de ser aceitável ou não , minha experiência profissional foi de que ela é aceita .
precisa saber é o seguinte
4
Espero ser profissional (mais de 20 anos de experiência). Não estou escrevendo testes de unidade para a maioria do meu código (além de bibliotecas de tempo de execução triviais). Eu escrevo contratos e testes de integração. E não estou usando OOD / OOP de nenhuma forma, é claro.
SK-logic

Respostas:

21

Para testar o que?

Se você está falando de 100% de cobertura de código, é extremamente raro, não é útil e geralmente impossível. Da mesma forma, testar o código relacionado ao CRUD é uma perda de tempo, e seria altamente pouco profissional passar horas escrevendo o código que você não precisa, em vez de fazer algo realmente útil.

Agora, como desenvolvedor, você precisa saber como escrever testes de unidade e onde precisa deles.

Arseni Mourzenko
fonte
5

Teoria

Há um equívoco comum de que testes de unidade são para testar "unidades" .
Os testes de unidade, da mesma forma que todos os outros testes, testam a funcionalidade . Simplesmente, nada mais pode ser testado.

No entanto, a funcionalidade de um sistema complexo geralmente não pode ser testada com eficácia.
Digamos, um usuário pressiona um botão "Excluir" e nada acontece. Por quê? Um erro pode estar em um banco de dados, uma conexão pode estar quebrada, uma lógica principal pode funcionar mal ou até uma operação pode ter êxito, mas a interface não foi atualizada corretamente. Cada camada pode conter muitas funções que se chamam e nem sempre é claro onde está o erro.
Os testes de unidade são baseados em um paradigma de separação de componentes e testados individualmente.

Mais uma vez, ele não garante que todo o sistema funcione, mas simplifica os testes.

TDD não é um requisito por si só. Ele simplifica a codificação, forçando o desenvolvedor a responder primeiro: "o que eu realmente vou codificar?".

Custos

Muitos pensam que, ao não escrever testes, economizam seu tempo. Errado. Pensando estrategicamente, o custo de um erro aumenta exponencialmente com o tempo desde a aparência até a detecção.

Digamos que você cometa um erro no seu código, detecte e corrija no mesmo dia. O custo é de $ X .
Vamos supor que o erro permaneça não detectado e vá para a construção interna semanal. Felizmente, o controle de qualidade detectou, gerou um bug no rastreador de bugs, o problema foi objeto de uma discussão de 5 minutos em uma reunião de 5 pessoas, etc. Finalmente, você o corrige. O custo é a soma da mão de obra gasta por todos e, nesse caso , pode ser de US $ 3 * X.
E se o erro fosse no teste beta e envolver mais pessoas? Vamos digamos, $ 10 * X .
Se ele não for detectado por um longo tempo, for para 1.000 clientes (espero que não para um milhão!), 10 deles o detectaram, eles levantaram uma discussão com sua equipe de suporte, alguns podem chamar seu chefe, seus colegas de equipe tentam reproduzi-lo , etc, etc. Finalmente, o bug volta para você e você o corrige. Quanto, no total? Bem mais do que $ 50 * X .

Como você vê, um bug retornará mais cedo ou mais tarde para você (ou seu colega). A única diferença é quando isso acontece e quanto custaria.
Os testes de unidade reduzem o ciclo de vida de bugs e, portanto, reduzem os custos.

Pro's

  • Os testes de unidade permitem que o desenvolvedor codifique melhor . Tão simples como isso.
  • Eles deixaram economizar seu tempo;
  • Eles diminuem custos;
  • Os testes de unidade convivem com o código que eles testam. Após qualquer solicitação de alteração (que acontece o tempo todo), os testes se adaptarão.

Con's

Eu posso ver uma única desculpa para não escrever testes. Se você estiver escrevendo um protótipo, por exemplo, algo que nunca irá para as outras pessoas. Ou talvez você esteja escrevendo algo para um único uso.

bytebuster
fonte
11
TDD é para acertar as APIs.
Você diz o seguinte como se fosse uma contradição, mas não é: o There's a common misconception that unit tests are for testing "units". Unit tests, likewise all other tests, test functionality.teste de unidade é, obviamente, destinado a testar unidades ; é daí que o nome vem.
Andrés F.
11
@AndresF. IMHO, as unidades devem ser consideradas a maneira de organizar o código, mas não o assunto dos testes. Da mesma forma, "beber uma xícara de café" significa beber café organizado em xícaras, e não beber uma xícara. :)
bytebuster
3

Certamente, é aceitável não escrever testes de unidade para pequenos utilitários auxiliares internos, ferramentas de teste ou cenários em que os negócios realmente precisam de outras coisas além da qualidade e você, como desenvolvedor profissional, descobrir que pode executar o software e funcionar tão rapidamente sem.

Telastyn
fonte
3

Na minha experiência, 95% dos erros que podem ser detectados por testes de unidade vêm de chamadas para a camada de dados, especialmente após alterações no design do banco de dados. Se você estiver usando um banco de dados, basta testar todos os métodos usados ​​para acessá-lo. Os testes nem precisam ser elaborados, apenas verificações de sanidade.

Em resposta à sua pergunta - se você acessa um banco de dados e é um desenvolvedor profissional, deve usar testes de unidade. Caso contrário, isso depende.

Paulo
fonte
Se você está testando o acesso à camada de dados, esses não são testes de unidade! Os testes de unidade geralmente fazem você pensar em erros lógicos , como manipulação inadequada de condições de contorno. Não erros de dados!
Andrés F.
2

Realmente depende de como o aplicativo será usado. Esta é uma aplicação de missão crítica? Ou é um aplicativo de verificação simples, usado apenas internamente pelos desenvolvedores? Ao trabalhar nos aplicativos principais da sua empresa, deve haver tantos testes de unidade quanto necessário para garantir que as decisões de negócios sejam cobertas. Dependendo da sua empresa, esses são os aplicativos que os clientes veem e os bugs podem custar o dinheiro. Quando bem executados, os testes de unidade podem ser uma grande ajuda para garantir que seus aplicativos funcionem quando implantados. Mas não é uma cura para todos e testes em humanos ainda devem ser feitos. Aplicativos internos (ou auxiliares) simples não precisam de testes de unidade, mas ainda devem ser bem escritos.

TDD não é apenas escrever testes primeiro. Trata-se de garantir que seu código seja facilmente testável. E, na maioria das vezes, o código facilmente testável também é mais fácil de ler / depurar / manter. Geralmente, o código testável com facilidade também segue padrões e princípios de OO, como o SOLID. Eu argumentaria como desenvolvedor profissional que seu código deve sempre ser escrito dessa maneira.

bwalk2895
fonte
1

Você definitivamente não quer "nenhum teste". Se você escreve testes de unidade, tem pelo menos alguma garantia de que seu código corresponde aos seus testes (embora você precise garantir que seus testes correspondam às suas especificações).

Você não está pronto se tudo o que você tem são testes de unidade. Você provavelmente ainda precisa fazer testes de integração e testes de ponta a ponta (e com o tempo acumular casos de teste para detectar regressões de erros).

Vatine
fonte
11
O teste de unidade não é a única maneira de garantir a aderência a uma especificação. Não é nem o mais rigoroso.
K.Steff
2
@ K.Steff Você está totalmente correto. Espero que seja difícil ler minha resposta como "tudo o que você precisa é de teste de unidade".
Vatine 5/08
1

Eu vou sair em um galho aqui e dizer que é principalmente subjetivo e depende de seus objetivos. tl; dnr: É bom fazer isso, mas ser dogmático sobre isso só vai levar a mais problemas.

Os testes de TDD / unidade melhorarão a estabilidade do seu código. Eles facilitam as alterações sem conhecer muito bem a base de código, permitem refatorar mais rapidamente, permitem ter certeza de que você não está fazendo algo bobo. Os testes de unidade também podem ser uma perda de tempo. Tempo que poderia ser gasto escrevendo código. Também pode permitir que você se iluda pensando que seu código funciona quando não funciona, se você os seguir cegamente.

Se você trabalha para uma empresa que oferece suporte às melhores práticas e lhe dá tempo para implementá-las e deseja um aplicativo que dure, então é realmente melhor que todos usem e pratiquem testes de unidade e revisões de código. Ter uma equipe de controle de qualidade pode ser um substituto aceitável se os desenvolvedores não abusarem. Se você estiver escrevendo um protótipo (mesmo um de produção), pode ser mais rápido do que apenas fazer testes de fumaça.

Se você estiver trabalhando em algo em que uma bagunça não será o fim do mundo, provavelmente menos cobertura será boa. Transações financeiras? Grande quantidade. Se você tem uma equipe de desenvolvedores fortes que conhecem a base de código, trabalham bem juntos e não há rotatividade, provavelmente precisará de menos cobertura. Etc.

Então provavelmente será alguma função de

  • Tamanho da equipe / rotatividade
  • Prazo de validade desejado do aplicativo
  • A aplicação e como as falhas críticas são
  • Tempo fornecido para implementar as melhores práticas em relação ao cronograma de desenvolvimento
  • Aptidão de equipe (isso não significa ser um bom programador, você não deve escrever testes de unidade, mas uma equipe sem desenvolvedores juniores pode ser capaz de voar com mais sucesso)

Existem muitas situações em que não seria aceitável escrever testes de unidade. O TDD está no momento, mas não é uma bala de prata.

spinning_plate
fonte
0

É profissional escrever testes unitários de manutenção que economizarão tempo e lágrimas!

Existe um misconception that Unit test finds bugs. Bem, isso simplesmente NÃO é verdade para todos os casos. O teste de unidade não trata de encontrar bugs ou detectar regressões. É por definição examine each unit of your code separately. Mas quando seu aplicativo é executado de verdade, todas essas unidades precisam trabalhar juntas e o todo é mais complexo e sutil do que a soma de suas partes testadas independentemente.

Portanto, o objetivo do teste de unidade (dentro do processo TDD) é projetar componentes de software de maneira robusta.

Edit: Há uma exceção em que os testes de unidade realmente detectam bugs. É quando você está refatorando ou reestruturando o código de uma unidade, mas sem querer mudar seu comportamento. Nesse caso, os testes de unidade geralmente podem dizer se o comportamento da unidade mudou.

Yusubov
fonte
0

Como desenvolvedor profissional, é aceitável não escrever testes de unidade?

Não.

Sem dúvida - essa deve ser uma das primeiras lições aprendidas por um calouro. Você deve desenvolver testes de unidade para provar que seu código funciona antes de informar ao controle de qualidade que seu código está pronto para teste. Uma falha ao fazê-lo aumentaria os custos do projeto e diminuiria o moral da equipe.

Qual deve ser a profundidade desses testes de unidade?

Aqui está o teste decisivo: Se o controle de qualidade descobrir um bug no seu código, você ficará confortável em usar seus testes de unidade para provar sua diligência ao seu chefe?

Se sua resposta for 'Não', você deve elaborar um teste de unidade melhor (ou testes).
Se sua resposta for 'Sim', seu código estará pronto para verificação.

Como desenvolvedor profissional, é aceitável não escrever testes de unidade automatizados ?

Sim.

Especialmente se o tempo e o esforço despendidos para escrever testes de unidade automatizados superassem os benefícios obtidos pelo teste. Isso inclui, mas não está restrito a, código de interface do usuário que pode ser difícil de zombar.

Ênfase: Eu estou não dizer que é impossível escrever testes de unidade automatizados para código UI. Só estou dizendo que, na minha experiência, às vezes é difícil escrever testes de unidade automatizados para algum código de interface do usuário.

Jim G.
fonte