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?
testing
unit-testing
David Osborne
fonte
fonte
Respostas:
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.
fonte
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
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.
fonte
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.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.
fonte
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.
fonte
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.
fonte
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).
fonte
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
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.
fonte
É 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çãoexamine 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.
fonte
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.
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.
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.
fonte