Executando verificação de segurança...
3

TDD na prática: quem realmente pratica no dia a dia?

Toda pesquisa de "melhores práticas" de engenharia de software inclui TDD. Todo dev experiente diz que TDD é importante. E, na prática, a maioria não pratica.

Quero entender por quê, e se isso é problema.

O argumento a favor do TDD

Força você a pensar na interface antes da implementação. Isso melhora o design. Testes escritos depois tendem a testar implementação, não comportamento.

Feedback imediato. Você sabe na hora se quebrou algo.

Documentação executável. Testes bem escritos descrevem o que o sistema faz melhor do que qualquer README.

Por que não pratico consistentemente

Velocidade inicial. Na fase exploratória de uma feature, eu não sei ainda qual é a interface certa. Escrever teste antes de saber o que está testando gera retrabalho.

Tipos de código. TDD funciona bem para lógica de negócio. Para componentes visuais, integrações com APIs externas, scripts de migração: a aplicação mecânica de TDD gera testes frágeis.

Custo de manutenção. Testes mal escritos são piores do que não ter teste. E TDD praticado mal gera muitos testes mal escritos.

O que eu pratico de verdade

Testo depois, com cobertura nos caminhos críticos. Não é TDD, mas é o que realmente acontece.

Alguém aqui pratica TDD de forma consistente? Em que contexto funciona para vocês?

Carregando publicação patrocinada...
5

Toda pesquisa de "melhores práticas" de engenharia de software inclui TDD

Por isso o primeiro vídeo do meu canal vai se chamar "A péssima prática de seguir boas práticas".

Todo dev experiente diz que TDD é importante

Nem todo. Inclusive quem cria linguagem de programação não costuma usar TDD, por que será? É o software que mais se beneficiaria disso.

Força você a pensar na interface antes da implementação. Isso melhora o design. Testes escritos depois tendem a testar implementação, não comportamento.

Se o programador é ruim o TDD não vai salvá-lo. Se ele é bom o TDD pode não ajudar muito.

Feedback imediato. Você sabe na hora se quebrou algo.

Só se souber fazer bem, o que é raro.

Documentação executável. Testes bem escritos descrevem o que o sistema faz melhor do que qualquer README.

Isso nunca foi verdade e todos os projetos documentam de outras formas porque TDD não foi feito para ensinar um humano como usar aquilo.

Velocidade inicial. Na fase exploratória de uma feature, eu não sei ainda qual é a interface certa. Escrever teste antes de saber o que está testando gera retrabalho.

Isso.

Tipos de código. TDD funciona bem para lógica de negócio. Para componentes visuais, integrações com APIs externas, scripts de migração: a aplicação mecânica de TDD gera testes frágeis.

Verdade.

Custo de manutenção. Testes mal escritos são piores do que não ter teste. E TDD praticado mal gera muitos testes mal escritos.

Exatamente.

Alguém aqui pratica TDD de forma consistente? Em que contexto funciona para vocês?

Pra você ver como é fácil fazer o TDD errado: o que uma resposta dada por uma pessoa aleatória na internet vai ajudar alguém programar melhor? Quando não há entendimento exato do que vai fazer, TDD não pode ser feito. Quando não se sabe o que pode ser respondido ou não, não adianta perguntar.

De maneira alguma estou dizendo que TDD não presta e nunca deva ser usado.

Pesquise sobre SDD. Eu ainda estou avaliando a utilidade. Eu não glorifico nada, eu não jogo nada no lixo até ter informações reais sobre algi. Não posso adotar ou afastar algo porque outras pessoas disseram que é bom ou ruim.

Falei muito sobre: https://www.google.com/search?q=maniero+tdd

S2


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui).

2

O ponto sobre criadores de linguagem é forte, difícil argumentar contra. Acho que o problema com TDD é exatamente o que você descreveu: vira ritual sem entendimento. A maioria aprende o como sem nunca entender o quando e o por que. Vou pesquisar SDD, o nome não me era familiar. Qual você diria ser a diferença fundamental entre os dois?

3

Não sei ainda :D

SDD é uma abstração de maior nível, você documenta sem codificar, não é intenção dele fazer o que as pessoas acham que o TDD faz, mas ele não faz.

Não sei se é uma boa solução e sei que ele não elimina a necessidade de TDD se o projeto tem como requisito interno fazer os testes, mas pode ajudar na decisão de não fazer TDD.

Eu demoro para tomar uma decisão, porque ao contrário da maioria, eu só adoto algo depois de ter certeza que vai ajudar.

1

Faz sentido SDD ser uma camada acima: se a especificação já deixa claro o comportamento esperado, parte da necessidade do TDD como ferramenta de design de interface some. O problema é que a maioria dos projetos não tem especificação boa o suficiente pra isso funcionar de verdade.

O que me interessa no seu ponto é justamente essa distinção entre TDD como ferramenta de design versus TDD como ferramenta de verificação. O primeiro exige mudança de mindset real. O segundo é mais fácil de justificar, mas entrega menos valor.

Você já viu algum projeto em produção onde SDD eliminou de fato a necessidade de testes unitários, ou ainda é teoria a ser validada?

3

Acho que o TDD assim como outras práticas surgiram para resolver problemas, porém ao longo dos anos o programador foi limitado a posição de escrever código e a maioria ficou bem com isso.

Acho que um programador resolve um problema, mas nós fomos ensinados a pensar no problema apenas como um codigo e a solução como uma linguagem.

É fácil perceber isso, quando olhamos projetos aqui mesmo do tabnews e Plenos e Sêniors, não se dão ao trabalho nem de criar uma branch no github, fazem tudo na main, quando vemos diversos cursos ensinando linguagens que ninguém usa, mas nenhum ensinando sobre planejamento ou teste.

Acredito que o problema não é o TDD, o problema é o fato que a base dos programadores é baseada tanto em framework e linguagem, que o básico de testes muitos não sabe, que em vez de planejar, já abre o vscode e sai codando o que vem a cabeça.

Essa é apenas minha forma de vê as coisas, a IA chega escrevendo código mais rápido doque qualquer programador é capaz, mas a questão segue sendo: qual ia é melhor e não o que eu preciso estudar para ser um desenvolvedor melhor.

TDD na prática não é usado, pois o tempo para desenvolver o projeto é curto, como falei: o dev não aprende nem a planejar, então os prazos sempre ficam apertados e código vai para teste em produção e depois a gente corrige.

Não vou mentir, assim como cleancode, isso é aquela prática que na teoria é boa, mas no dia a dia com prazos limitados e zero noção de entrega, você deixa de lado, porque o cliente quer saber se funciona, se voce está num projeto com uma equipe bem estruturada e tudo planejado, fica fácil aplicar certas coisas e perceber que não e nada demais, porém na maior parte do tempo, voce está em projetos que ninguém tem noção do tempo gasto para nada e o resultado é o que já sabemos: coloca em prod e quando o cliente reclamar a gente ajeita.

Sempre que possível aprenda a teoria das coisas e aplique em pequenos projetos de final de semana, independente doque for, esse codigo vai para o lixo, mas você aos poucos está aplicando aquela teoria que você leu, mesmo que não precise disse agora, em algum momento pode surgi a oportunidade de você usar e muito desses conhecimentos se conectam com outros, nada vai realmente ser jogado fora, além de algumas linhas de código.

Livros seguem sendo ainda uma excelente fonte de consulta, não precisa ser escravo deles, pegue algum, leia, veja um vídeo, a teoria vai fazer sentido mesmo que em diversos vídeos o programador fale abobrinha as vezes.

1

Concordo com o ponto sobre a base fraca em planejamento. O TDD acaba sendo sintoma disso: não é só sobre teste, é sobre pensar antes de sair codando. O que me preocupa com a IA é exatamente o que você apontou: ela escreve código rápido, mas quem define se o comportamento esperado está certo ainda é o dev. Sem testes, você só sabe que o código compila, não que faz o que deveria. Você acredita que isso vai forçar a próxima geração a aprender testes por necessidade, ou vai continuar sendo opcional no mercado?

3

Meus 2 cents,

Sobre TDD o @LucasMontano publicou um video hoje (seg, 20/abr) comentando um tweet do "Uncle Bob" sobre o assunto:

Uma coisa tenho de reconhecer: se vamos delegar mais codigo para a IA (com seus volumes insanos), estruturas como PRD, SDD e TDD acabam sendo urgentes.

E talvez esse seja um elemento que nao gostamos de admitir: ainda vemos estes tipo de estrutura (como TDD) basicamente do ponto de vista humano e isto esta em transformacao, e nao importa que a IA/LLM ainda gere codigo lixo - em algum momento do tempo isso vai reflexionar, independente se daqui 2 meses, 6 meses ou 1 ano - e precisamos estar preparados para lidar com isso.

Talvez em breve acabemos criando outros tipo de estruturas, afinal tudo que temos foi criado/desenvolvido pensando em volume e velocidade humanos - para esta nova era de codificacao assistida por IA eh necessario repensar este ponto (e rapido).

Post devidamente favoritado via extensão TABNEWS FAVORITOS

Saude e Sucesso !

2

Vou assistir o vídeo. O ponto sobre volume e velocidade faz sentido: toda nossa tooling foi calibrada para o ritmo humano. Com IA gerando código mais rápido, os pontos de controle precisam mudar. TDD com IA pode ser mais sobre revisar assertions do que escrever testes do zero. Você sente que no seu trabalho atual já está mudando a forma como validam o código que a IA gera?

3

Meus 2 cents extendidos,

Você sente que no seu trabalho atual já está mudando a forma como validam o código que a IA gera?

Sem sombra de duvida.

A cerca de 1 ano, se alguem me falasse que eu iria estar criando app sem digitar codigo so acreditando no que a IA gera, ia achar graca e que nao fazia sentido - afinal programar nao eh so digitar codigo, mas tambem entender todo contexto que gira no seu entorno (usuarios, infra, etc).

Fato: a extensao TABNEWS FAVORITOS foi criada em 2 a 3 horas, e sem codificacao por IA ela nao ia existir (nao tinha tempo disponivel para fazer na mao).

So que testes basicos nao servem: eh necessario de fato verificar os contratos E as regras de negocios (que nem sempre eh uma questao apenas de checar se o dado X sai da funcao Y quando a informacao Z entra).

O que achei legal no video do @LucasMontano eh justamente ele trazer de forma sistematizada o que venho fazendo no dia-a-dia (e que nao tinha notado): escrever testes (no sentido de planejar, uma vez que ate a codificacao dos testes eh a IA que faz) virou essencial - sem eles, "quando" (e nao "se") a IA alucinar e eu precisar refazer o contexto do zero, preciso ter seguranca que a alucinacao nao detonou algo que eu nao percebi.

Usar IA mudou muita coisa - antes, eu sabia que um humano teria o "felling" necessario para nao fazer merda em um codigo, mesmo sem testes. A IA nao tem "felling", nao eh deterministica: entao acaba sendo primordial se proteger.

Saude e Sucesso.

1

O ponto do 'feeling' é o que mais faz sentido pra mim. Humano erra mas tem contexto do erro, sabe quando algo parece errado. A IA executa com confiança mesmo quando está completamente errada.

Tenho usado Claude Code bastante no BloodLink e o padrão que funcionou: escrever o contrato da função antes, depois deixar a IA implementar. Quando ela alucina, os testes pegam antes de eu perceber pelo comportamento. Isso me forçou a pensar melhor nas interfaces antes de qualquer linha de código, que é exatamente o que o TDD tradicional propõe. Só que cheguei lá por outro caminho.

A extensão de favoritos ficou boa, usei bastante. Qual ferramenta você usa pra deixar a IA escrever os testes? Prompt direto no chat ou alguma integração com o editor?

3

Meus 2 cents extendidos,

Tenho usado o VSCode (+copilot) e Antigravity (+gemini) e agora ClawCode (+OmniRoute e o LLM free de ocasiao).

Nesta estrutura, peco o desenvolvimento direto pelo prompt, quando faco a especificacao (PRD - macro, checklist - por tarefa e SDD - descricao da funcionalidade), ali ja tem a ordem para criar a funcionalidade E o teste necessario.

Saude e Sucesso

1

Essa abordagem de embutir o teste na própria spec é inteligente. O LLM acaba sendo o disciplinador que o dev muitas vezes não é sozinho: se a ordem está no prompt, ele segue.

No meu caso com Claude Code, percebo que quando especifico bem o comportamento esperado antes, o código gerado é mais coerente. Mas ainda cai no mesmo problema do TDD manual: quando a spec é vaga, o teste gerado testa implementação, não comportamento.

A diferença é que com LLM você consegue regenerar teste e código juntos rapidamente. Isso muda um pouco o custo-benefício do ciclo red-green-refactor.

Você define os critérios de aceite no SDD antes de gerar, ou vai refinando junto com o código?

3
1

Faz sentido: a IA escreve o boilerplate do teste e você fica com o trabalho que importa, que é pensar no comportamento esperado. O custo que bloqueava todo mundo era exatamente esse.

O que me curioso é se a IA te incentivou a testar mais casos extremos, ou ela tende a gerar os testes "felizes" e deixar os edge cases pra você cobrir manualmente?