Como convencer colegas de equipe a usar o TDD [fechado]

15

Eu sou a única pessoa na minha equipe que usa TDD. Como faço para que eles usem?

Estou aborrecido porque, quando eu puxo, o código de alguém interrompe meus testes e sou eu quem precisa corrigi-los.

O uso da solicitação github, fork e pull resolverá esse problema, para que eles precisem passar no teste antes que a pull seja aceita?

Não sou o gerente do projeto e não consigo convencê-la a usá-lo.

wizztjh
fonte
11
"o código de alguém interromperá meus testes" você considerou uma possibilidade de que isso indique que seu design e / ou testes são muito frágeis?
mosquito
1
Intimamente relacionados: programmers.stackexchange.com/questions/44145/…
Péter Török:
2
Talvez comece a criar testes de integração. Essas são mais difíceis de quebrar, pois a entrada / saída deve (quase) sempre ser a mesma. Depois que todos estiverem se acostumando, adicione testes de unidade, pois os testes de integração ficam um pouco lentos ao executar todos eles. Em uma nota lateral: se eu fosse um PM de algum projeto pequeno (com menos de dois meses), não gostaria que os desenvolvedores passassem algum tempo escrevendo testes também. O projeto precisa ser concluído e a realização de testes é boa, mas leva tempo e, em projetos tão pequenos, as chances são pequenas de você fazer muita manutenção no tempo do projeto.
Jan_V
1
Os desenvolvedores devem continuar escrevendo códigos robustos e estáveis ​​e os testes podem ajudar com isso. Nem estamos dizendo aos PMs que estamos escrevendo testes, pois não é da sua conta. Nós os escrevemos para garantir que nosso código ainda funcione da mesma forma que há 5 meses. Além disso, você não deve vê-lo como 'testes' reais; é mais um seguro, ajudante ou verificador. Quando alguém diz 'estamos escrevendo testes', podemos ficar confusos e pensar que essa é uma tarefa que um testador deve executar.
Jan_V
2
Também muito parecido com: programmers.stackexchange.com/q/141468/39178 ... e ainda estou procurando por bons argumentos. O problema é que você realmente não pode mudar a mente das pessoas se elas não estiverem abertas à mudança ou se sentirem que o que elas já fazem é bom o suficiente para elas.
S.Robins

Respostas:

5

Na minha opinião, a única maneira de convencer sobre os testes é demonstrar que eles são úteis - ou seja, que as falhas nos testes ajudam a encontrar e corrigir bugs .

A maneira como você descreve o problema, parece que este não é o caso aqui. Veja...

... quando eu puxo, o código de alguém interrompe meus testes e sou eu quem precisa corrigi-los.

Se bem entendi, você quer dizer que precisa modificar os testes. Bem, isso não soa como falhas de teste que ajudam a encontrar e corrigir bugs, não é? Se os testes não ajudarem a encontrar bugs, é uma posição bastante fraca para convencer seus colegas - o que eles poderiam esperar ganhar? correções tediosas no código de teste frágil?

Isso pode parecer um beco sem saída, mas realmente não é. Seu objetivo final (convencer o TDD) ainda faz muito sentido, não o deixe cair. Apenas concentre seus esforços novamente em remover o obstáculo que você descobriu.

As falhas de teste que o incomodam agora são essencialmente "alertas falsos" - o que significa que são erros nos testes que não estão no código. Use-os como uma oportunidade para aprimorar testes e aprender como criar um bom design de teste confiável. Trabalhe em testes para tornar os "alertas falsos" menos frequentes e para facilitar a descoberta de erros reais no código testado.

Ao descobrir erros reais, informe seus colegas e ajude-os a corrigir - e não se esqueça de apontar que esses erros foram encontrados pelos seus testes. Isso criará um terreno realmente sólido para convencer seus colegas.


Vale ressaltar que as habilidades de design de teste que você desenvolve no estágio "preliminar" provavelmente serão necessárias novamente se (quando :) você finalmente convencer seus colegas de equipe a usar o TDD. Pense nisso...

... O que aconteceria quando o desenvolvimento orientado a testes fosse apresentado a seus colegas inexperientes?

A primeira coisa a esperar é que os caras comecem a escrever testes de baixa qualidade e (horror!) Até quebrem os bons enquanto aprendem. Para ajudá-los a encontrar uma maneira de fazê-lo corretamente, você precisará de um entendimento sólido do bom design de teste.

Todos os erros que você encontra e corrige em seus testes agora serão repetidos várias vezes por todos os seus colegas de equipe quando começarem a aprender. Se (quando!) Isso acontecer, é melhor você estar preparado para explicar rápida e claramente como melhorar se deseja que eles continuem positivos sobre o TDD.

mosquito
fonte
2
Boa resposta, mas gostaria de mencionar que se ninguém mais estiver TDDing ou mesmo executando o conjunto de testes, um cenário comum para interromper um teste seria se alguém fizesse uma alteração no código de produção sem alterar o teste para esperar uma mudança de comportamento. Pode ser tão simples quanto alterar o texto em uma mensagem de exceção. Eles fazem check-in, OP faz check-out, testes quebram, hilaridade se segue. Você pode considerar um teste que declara uma mensagem de erro exata muito frágil, mas o contrato do meu último trabalho definiu um defeito como qualquer desvio do AAT indicado, e as mensagens de erro eram defeitos comuns.
Keiths
12

Quando quis incentivar o uso do Test Driven Development , executei um Cyber-Dojo . Com esse tipo de exercício, a ênfase não está no código em si, mas no processo de escrita do código .

Passamos uma tarde, em pares, repetindo o mesmo kata, mas sob condições diferentes. Começamos com todos os grupos fazendo um exercício ao mesmo tempo. Isso forneceu uma linha de base.

Em seguida, discutimos alguns dos princípios básicos do TDD, todos mudaram de parceiro e repetiram o mesmo kata. Repetimos o mesmo kata para enfatizar menos a geração de código e, em vez disso, concentrar as pessoas no processo de nomear casos de teste e no ciclo Vermelho / Verde.

Em seguida, repetimos o kata novamente, mas aproximadamente a cada 10 minutos uma pessoa em cada grupo se deslocava para outro grupo, simulando os ambientes de equipe bastante fluidos que costumamos encontrar nos dias de hoje.

Na iteração final, os dois parceiros foram alterados a cada 10 minutos ou mais em grupos diferentes. Isso ajudou a demonstrar que, com o TDD, mesmo a transferência de uma equipe para uma equipe completamente diferente não precisa necessariamente ser muito dolorosa, pois o projeto deve ter apenas um ciclo de vermelho / verde a cada trabalho.

O interessante é que havia poucas pessoas que haviam feito algum TDD antes da sessão, mas que conhecimento sobre TDD havia se espalhado rapidamente até a iteração final através do kata, a maioria das pessoas estava pensando de uma maneira TDD ou pelo menos podia entender por que pode ser benéfico.

As pessoas geralmente diziam que a tarde foi divertida e informativa e agora estamos procurando outras maneiras de usar o Cyber-Dojo no meu local de trabalho.


O Cyber-Dojo , escrito por Jon Jagger , funciona incrivelmente bem para esse tipo de exercício. É um ambiente baseado na web integrada para fazer a prática deliberada de TDD e aprender sobre a dinâmica da equipe. Ele tem muitos katas selecionados especificamente para ajudar as pessoas a se concentrarem no processo de TDD e não no problema. Ele também suporta uma variedade de linguagens, de Python e Ruby a Java e C ++.

O melhor é que, depois de fazer um kata, você pode voltar e observar a progressão vermelho / verde (ou talvez não * 8 ') de cada um dos grupos participantes. Os semáforos são uma ótima maneira de visualizar como o processo TDD funciona.

Se você deseja seu próprio servidor CyberDojo, todo o projeto pode ser encontrado no github e há até uma máquina virtual do dispositivo Turnkey Linux vinculada a partir daí, o que significa que, assumindo que você já possui o VMware player ou o VirtualBox instalado, você pode estar em funcionamento no alguns minutos de download do aparelho!

Mark Booth
fonte
1
+1 para a referência de cyber-dojo. Não estava ciente. Parece muito interessante.
Radarbob
8

Se eles resistirem ao TDD, está tudo bem. Muitas pessoas (inclusive eu) estão tendo problemas para escrever testes de unidade primeiro.

No entanto, você deve fazer uma pergunta sobre não ter nenhum teste de unidade e a questão da quebra dos testes de unidade. Os testes de unidade são uma rede de segurança que evita muitos possíveis erros e permite a refatoração de código. Explique sobre qualidade de código mais alta e código mais limpo.

Acho que o melhor seria encontrar um vídeo que explique as vantagens do uso do TDD e mostrá-lo em uma reunião.

Se ela se recusar a ouvir, você pode tentar procurar alguém acima dela, mas isso pode não ser muito inteligente se o seu chefe for tão teimoso.

BЈовић
fonte
6

É realmente difícil convencer as pessoas a mudar seus hábitos, mas aqui estão algumas coisas que você pode tentar:

  • Converse com os outros desenvolvedores e explique a eles por que você acha que o TDD é uma boa ideia.
  • Convença-os (ou pelo menos alguns deles) a experimentá-lo por um tempo limitado
  • Tente estabelecer alguns requisitos mínimos para trabalhar bem em equipe. Eles não precisam necessariamente fazer TDD, mas certamente não devem verificar o código que está falhando nos testes de unidade. Essa é uma questão separada do que convencê-los a usar o TDD e é muito mais importante de resolver.
  • Tente convencer a gerência a impor um período de teste para TDD. Você precisará estar pronto para fornecer algumas evidências sobre por que essa é uma boa prática e como economizará tempo e dinheiro da empresa no futuro.

Se nada disso funcionar, considere trabalhar em outro lugar. Existem muitas outras empresas em que sua vida seria consideravelmente mais fácil.

Oleksi
fonte
1
Cingapura é um país pequeno, sem muitas opções.
Wizztjh 12/04
6
"Se nada disso funcionar, considere trabalhar em outro lugar". Ou, apenas para constar, você pode considerar parar de usar o TDD :).
Lukas Stejskal
1
+1 para o terceiro marcador. Esse é o verdadeiro problema.
Rjalk
6

Existem duas questões ligeiramente diferentes aqui: levar as pessoas a fazer TDD e as pessoas que quebram seus testes.

Não tenho certeza sobre o primeiro problema. Pessoalmente, acho que é uma maneira artificial de trabalhar e que não é adequada a todos os tipos de desenvolvimento. Sou a favor de ter um bom conjunto de testes de unidade, mas geralmente acho mais eficiente escrever o código primeiro e depois os testes, pois ao escrever o código, minhas idéias estão sempre mudando e é uma perda de tempo escrevendo testes também cedo (IMO).

Na segunda questão, configure o projeto para que os testes de unidade sejam executados no check-in, para que outros desenvolvedores não tenham outra escolha a não ser saber que eles quebraram um teste.

Chris Card
fonte
Este é um bom ponto, são dois problemas separados. Primeiro, resolva o problema "eles quebram meus testes". Em seguida, trabalhe para que eles façam TDD.
ozz
+1 em "porque, enquanto escrevia o código, minhas idéias estão sempre mudando" e observação interessante. Talvez eu seja da mesma maneira, e é por isso que tenho dificuldade em escrever testes primeiro? Especialmente no início de um projeto experimental.
precisa saber é o seguinte
4

Como já foi dito em muitos outros "como convencer o X a usar o método / tecnologia Y", minha resposta é sempre a mesma: por exemplo.

Use-o e tenha melhores resultados (mensuráveis). Depois, verifique se os outros notam.

Klaim
fonte
2

Em um projeto existente, você não. É o mesmo que fazer alterações na maneira como os colchetes são colocados no código legado, porque você não gosta do estilo de indentação.

Dante
fonte
é um projeto novo, eu o iniciei esta semana.
Wizztjh 12/04
Nosso último projeto ficou muito grande e com erros. Então, acho que é uma boa ideia usar o TDD para este projeto.
Wizztjh 12/04
2

Muitos bons conselhos. E agora, um pouco mais ...

Você deve conquistar corações e mentes (WHAM), um ludita de cada vez. Esqueça de forçá-lo pela garganta. Muitas lições sobre objetos durante um período indeterminado (desculpe por isso). Eventualmente, você atingirá uma massa crítica e convencerá a pessoa "certa".

Seu entusiasmo constante e consistente e a vocação para TDD são muito importantes em uma campanha WHAM.

Você deve transformar as quebras de teste e de código em momentos de aprendizado, as lições que são importantes para seus codificadores. Torne pessoal. IE Eles se preocupam com a reputação de fornecer código limpo acima da média? Eles se preocupam com o gerenciamento que os incomoda sobre o código que está atrasado porque os testadores de integração lhes deram uma verificação da realidade? Jack deseja modificar algum código difícil, mas tem medo de efeitos colaterais?

Reúna bons exemplos de quebra de teste como interceptar erros induzidos pelo codificador. Os codificadores verão os testes alterados como um trabalho desnecessário para códigos irrelevantes; eles devem entender que os testes apenas cobriram suas bundas.

Encontre algum código com implicações globais (algum método simples de utilidade), crie alguns testes e demonstre que os testes permitem mudanças sem medo de terremotos em todo o aplicativo. E pretendo enfatizar também a questão emocional!

Reúna alguns exemplos simples de tempo para limpeza do código (isto é, passados ​​para a produção) e demonstre que, apesar do esforço extra para a codificação de teste , conseguimos fazê-la mais rapidamente e com maior qualidade.

Aviso: O TDD não é uma cura e não pode superar o design e a codificação incorretos de OO (mas definitivamente pode expô-lo). Não deixe que os luditas culpem o esforço do código de teste por sua incompetência.

radarbob
fonte
1

Eu tentaria tentar novamente convencer o gerente. Pelo que você escreveu, não acho que você possa convencer seus colegas de equipe a fazer TDD pelas costas.

Você tem que falar a língua dela. O gerente tende a não se impressionar com a tecnologia, mas entende o idioma da empresa:

  • Os testes economizarão tempo durante o desenvolvimento, porque, em vez de testes manuais (tentando reproduzir erros localmente, jogando com o console do rails ...), você executará os testes automaticamente

  • O teste economizará muito tempo durante a manutenção do aplicativo, quando você poderá detectar facilmente erros sempre que alterar alguma coisa. Explique que os testes exigem maior investimento inicial, mas se pagam a longo prazo (a manutenção de bons testes geralmente é rápida e fácil)

  • e o que você fará com o tempo extra? criar coisas moar e fazê-los ganhar dinheiro :)

Quanto aos programadores, tente este argumento (funcionou para mim, há muito tempo): "Você está testando código de qualquer maneira, com ou sem TDD. Somente você o faz manualmente, em vez de automatizá-lo. Desenvolvedores inteligentes automatizam o máximo de coisas possível. "

Lukas Stejskal
fonte
0

Em projetos reais com prazos, as pessoas querem se concentrar em realizar o trabalho com o que sabem. Essa é apenas a natureza humana. E se você nunca aprendeu TDD, seria o mesmo que ela nessa situação. Eu garanto.

Por que a multidão da coleta de lixo não ama, aprende e vive a RAII? Como você pode defender o gerenciamento automático de memória, mas manter o gerenciamento antiquado de recursos gerais, como arquivos, conexões etc.? Como o RAII é uma tecnologia que eles não conhecem, entendem e não têm tempo para usar quando têm um prazo que precisa ser feito.

Aposto que você não usa o RAII e não está disposto a aprender e entender o projeto atual. O mesmo que seu colega de trabalho que não está disposto a aprender e entender o TDD.

Lord Tydus
fonte