TDD com recursos limitados

13

Eu trabalho em uma grande empresa, mas em uma equipe de apenas dois homens, desenvolvendo aplicativos LOB para desktop. Estou pesquisando o TDD há um bom tempo e, embora seja fácil perceber seus benefícios para aplicativos maiores, estou tendo dificuldades para justificar o tempo para começar a usar o TDD na escala de nossos aplicativos.

Entendo suas vantagens em automatizar testes, melhorar a capacidade de manutenção etc., mas, em nossa escala, escrever testes de unidade básicos para todos os nossos componentes pode facilmente dobrar o tempo de desenvolvimento. Como já estamos com falta de prazos extremos, não tenho certeza de que direção tomar. Embora outras práticas, como o desenvolvimento iterativo ágil, sejam perfeitas desde então, estou meio que dividida com as compensações de produtividade do TDD em uma equipe pequena.

As vantagens do TDD valem o tempo extra de desenvolvimento em equipes pequenas com cronogramas muito apertados?

bunglestink
fonte
o que LOB representa? Linha de negócios?
perfil

Respostas:

14

A verdade feia é que, inicialmente, isso o atrasará . Qualquer novo processo ou prática leva algum tempo para acelerar. Na minha experiência, o TDD não paga com a implementação inicial tanto quanto com manutenção, correção de erros e extensão. Sei que para outros existe um pagamento imediato, portanto, isso dependerá do estilo de codificação atual de cada pessoa.

Enquanto eu sou um grande defensor do TDD (eu o trouxe para o meu trabalho atual) , acho que você precisa ter um pouco de espaço para respirar (prazos / prazos) para explorar e entender a prática.

Quanto menor sua equipe, mais imediatamente você poderá se beneficiar do TDD. Vi esse pagamento em tamanho de equipe de 6 a 3.

dietbuddha
fonte
2
+1: não se trata de economizar no tempo de desenvolvimento, economiza (muito!) No tempo de depuração e manutenção.
Javier
4
"Se você acha que o primeiro teste é caro, tente depurar mais tarde"
Ryan Bigg
@ Ryan Bigg: Concordo que os testes de unidade são um ótimo suporte para a depuração, mas o código bem escrito não é realmente difícil de depurar com um depurador tradicional.
Giorgio
@Giorgio: o código pode ser o mais bem escrito possível, quando você não pode testá-lo isoladamente devido à falta de infraestrutura em torno desse código, o ciclo de teste / depuração / alteração / teste novamente precisa de mais tempo. Isso é especificamente verdadeiro quando você está procurando um bug no qual não conhece a causa raiz e não sabe onde, em suas 100 mil linhas de código bem escrito, pode estar a falha.
Doc Brown
10

O tempo extra de desenvolvimento do qual você está falando pode ser uma ilusão .

O que diferencia o TDD do teste de unidade padrão é que ele não é usado apenas para fazer testes.

TDD is a new way of developing software. É uma das melhores maneiras que eu conheço.

Portanto, não está relacionado ao tamanho do seu projeto. Você extrairá os benefícios da primeira linha de código .

  • forçará você a estruturar seu código de uma maneira que será mais fácil manter e reutilizar. Isso impulsiona o design do seu software.
  • tornará a refatoração rápida, segura e agradável.
  • ajuda a escrever pequenos blocos de funcionalidades que facilitam muito a implementação de tarefas.
  • geralmente torna a tarefa de depuração menos frequente.

fonte
Eu ia responder, mas Pierre diz bem. Comece pequeno, em algo que você precisa construir de qualquer maneira, e você deve começar os benefícios no primeiro dia.
Marcie
2
Também não pode ser uma ilusão. Uma nova prática pode levar algum tempo para ser desenvolvida. Especialmente se não houver mais ninguém por perto que tenha feito isso. Eu diria que pode ser de qualquer maneira intencionalmente.
dietbuddha
@dietbuddha: Concordo com isso, hesitei em eximir-me, mas queria enfatizar os benefícios reais do TDD quando bem aplicado.
1
@Pierre - O TDD parece ter um primeiro passo particularmente desagradável (e falo das minhas repetidas lutas para começar) tendo sofrido o mesmo problema, ou seja, muito o que fazer e pouco tempo. Eu não preciso me convencer dos benefícios - mas me autodestruir e, em seguida, meus colegas estão além de mim (você terá que confiar que não é falta de habilidade da minha parte ...) - em parte por causa da pressão de tempo e em parte por não saber exatamente como.
Murph
1
@ Murph: Você está trabalhando em aplicativos intensivos de interface do usuário? Costumo parar de usá-lo quando trabalho em tais aplicativos.
8

equívoco comum, deixe-me gritar:

OS TESTES NO TDD SÃO PARA RECURSOS

EOM.

Edit: deixe-me elaborar: "escrever ... testes de unidade para todos ou nossos componentes" é teste de unidade , não TDD. Uso rotineiramente o TDD em equipes individuais com grande sucesso; o pagamento é extraordinário.

Steven A. Lowe
fonte
1
equívocos comuns, o TDD gera testes de projeto. A realidade é TDD gerar especificações do projeto.
Exibir nome
3

Existe um ótimo livro sobre TDD, A arte do teste de unidade ( site oficial ), com exemplos em .net com uma versão java em andamento. A parte boa é que há capítulos inteiros considerando questões como "Integrando o teste de unidade à organização" - Capítulo 8 e "Trabalhando com código legado" - Capítulo 9. Embora eu ainda não seja um especialista neste campo (ainda :-)) , com base na minha experiência, acredito que este seja um bom ponto de partida.

A arte da tampa do teste de unidade

Dimitrios Mistriotis
fonte
1

Você precisa de algumas perguntas para obter as respostas:

  1. Quanto tempo você gasta após o lançamento da correção de bug no código? Se você puder quantificar isso, poderá achar que é igual ou mesmo excede o tempo "extra" que levaria para você escrever o teste que ajudaria a impedir que esses erros acontecessem.

  2. Com que frequência uma edição aparentemente simples para refatorar o código ou adicionar um novo recurso interrompe algo aparentemente não relacionado? Novamente, com boa cobertura de teste, eles podem ser reduzidos.

Mesmo que você não consiga colocar números exatos, você deve demonstrar que está gastando esse tempo de qualquer maneira, para que possa gastá-lo "na frente" e (espero) acabar com um produto muito mais estável.

ChrisF
fonte
1

Quando as pessoas me falam sobre começar a adotar testes em sua equipe, eu sempre verifico como os testes serão executados. Muitas vezes, as equipes não têm uma construção contínua em vigor. Se você tiver recursos limitados, sugiro que a configuração de um servidor de IC seja um pré-requisito para iniciar qualquer incursão séria nos testes.

Depois de obter essa configuração, comece a praticar TDD. Lembre-se de que, se o sistema não tiver sido desenvolvido com o teste em mente, você poderá ter dificuldades para tornar o código existente testável e será caro reestruturá-lo.

Comece procurando lugares fáceis para começar com o TDD - novas classes ou módulos, com poucas dependências. Classes de utilidade e estruturas de dados geralmente são boas coisas para começar.

Experimente como ele muda a maneira como você pensa sobre o seu código, observe quanto melhor o código que você produz é e quanto mais confiante você está sobre esse código.

Sei que realmente não respondi à pergunta, mas acho que meu argumento é que você deve ser capaz de fazer tudo isso sem um custo adicional enorme. Ao trabalhar com seus primeiros exemplos, você entenderá melhor as vantagens do seu projeto.

Conclusão - desenvolvimento mais lento, mas poucos defeitos, muito menos tempo corrigindo bugs.

Gavin Clarke
fonte
1
Uma adição: Inicialmente, procure testes de maior valor. Testes que informam, desde o início, que você quebrou sua base de código. Estes tendem a ser altos, testes abrangentes que não dizem o que você quebrou, mas que você o quebrou. Você verá muito rapidamente o valor de um IC, com testes e ambiente. Use testes para depurar a quebra. Com um sistema instalado, os custos de adicionar novos testes começam a ficar mais fáceis / baratos e você pode se concentrar em mais testes que fazem um trabalho melhor para provar que funciona e mostrar onde não funciona.
Jim corrida
0

Aqui é onde eu acho que o Desenvolvimento Orientado a Comportamento mostra ganhos imediatos, mas não tenho certeza de que o desenvolvimento orientado a teste o faça.

No desenvolvimento orientado por comportamento, você aborda seus tickets de uma maneira diferente: senta-se com a pessoa de negócios e trabalha com ela para definir os comportamentos que esse pedaço de funcionalidade deve ter. Eu descrevo isso em uma entrada no meu blog (o título do post: Comportamentos de escrita ).

Sentar-se com a pessoa de negócios ou com quem ajudará você e eles a entender melhor o que o sistema precisa fazer para que todos fiquem felizes com essa parte da funcionalidade. O que é preciso fazer para poder ser aceito pelo processo de controle de qualidade que você possui.

Definir critérios de teste e, em seguida, gravá-los em seu conjunto de testes automatizado, deve reduzir a quantidade de vaivém que você recebe: alguém alegando que a funcionalidade está quebrada, porque você perdeu alguma coisa (porque você perdeu alguma coisa legitimamente ou porque nunca disse a ela você sobre isso).

Isso também pode ajudar a percepção dos outros sobre sua equipe: se você se sentar e definir o que precisa ser feito no sistema, poderá passar de "idiotas que superengenham tudo e gastam tempo com coisas que não pedimos", para, "pessoas inteligentes que estão apresentando recursos úteis".

TL; DR: o desenvolvimento orientado a comportamento pode mostrar melhorias rapidamente porque é focado no "cliente". O Desenvolvimento Orientado a Testes, para mim, parece ser sobre o teste interno da base de código com a qual "ninguém" se importa e oferece benefícios comerciais menos óbvios. (O Behavior Driven Development tem uma mudança imediata: na sua frente, os engenheiros estão repentinamente passando muito mais tempo com o "cliente" ou o analista de negócios para tentar acertar isso - o que deve ser visto como uma coisa boa. " , eles estão tendo uma reunião sobre o recurso X, o que significa que há progresso nessa frente! ")

RyanWilcox
fonte