[quote=YvGa][quote=x@ndy]
Não! Você vai descobrir o resultado implementando o teste! Isso é muito estranho mas essa é a grande sacada. A cada passo que você dá vai construindo a lógica que vai te levar ao resultado! Vejo muitos programadores fazerem “Teste de Mesa” para desenvolver uma lógica e o teste em TDD é muito parecido com isso. Ao invés de rascunhar algo no papel vou implementando no meu teste!
[/quote]
Eu acho que se deve ter muito cuidado com essas afirmacoes. Eu entendi a duvida do gamesrod.
Talvez não seja essa a tua intenção, mas você passa a impressão de que usa os testes para descobrir a regra, o que nem de longe é verdade. A regra você sabe qual é, você precisa saber.
Para fazer uma transferência bancaria eu preciso saber que 10 reais sairão da conta A para a B, não é possível eu descobrir isso durante os testes. O uso dos testes me levará ao como não ao o quê.
Como eu disse, talvez não seja a sua intenção, mas é isso que está parecendo.
Particularmente, eu uso testes como o gamesrod citou, sei que a media de 10 e 2 é 5, essa é a regra e isso eu preciso saber de antemão, seja o quão complexo for, então espero que meu teste me retorne 5. O teste, além de servir pra ajudar a definir o meu modelo, além de garantir que as coisas continuarão funcionando como eu espero, ainda me serve como documentação, então ele precisa ser limpo, legível e a intenção dele tem que ser clara.[/quote]
É aqui que está o problema. O que vc está exemplificando é Test First. O que o x@ndy está falando é TDD. O TDD é sim para encontrar a regra no sentido que vc não sabe como nem o quê é o resultado. Vc sabe o que lhe especificaram, ou seja o behaviour. No caso seria “o sistema deve calcular a média”. Como disse o exemplo é trivial pq vc já sabe como se calcula uma média, portanto não ha desenvolvimento envolvido, só implementação. Entao vc estabelece balizas conhecidas nos seus testes como a média de 10 e 2 é 6 que irão provar que sua implmentação não está errada. Isto é Test First. O test serve como arcabouço do resultado. Em TDD o teste serve como exploração do resultado. Imagine q vc tem que integrar com o Twitter e não ha uma API em java para isso. Vc sabe a especificação “ler o timeline do twiter”, mas vc não sabe como nem o quê. Ou seja, que código eu preciso e como eu preciso organizá-lo. Ai vc investiga, começa sabendo que ha um URL para acessar, ai vc aprende o protocolo, etc… isso é apenas informaçao, mas com ela vc vai montando seu codigo. Usa um objeot URL para fazer a coneção e ler e processa o HTML na mão. Blz. funcioana, mas não é elegante e não faz tudo o que vc precisa. Ai vc começa a melhorar o código e o design. Tlv vc deixe de usar o URL e passa a usar o HTTPClient da apache, etc… vc está desenvolvendo a sua API de conversa com o twiter e está usando o junit - por exemplo - como cliente dessa api, e explorando se é fácil ou dificil de usar, de entender , etc… Não é uma mero teste de unidade é todo um ciclo de desenvolvimento em que o teste é o client da aplicação/api.
Eu sei que nuance não é trivial e é bem complexo de explicar , mas se vc tem uma especificação , tem um teste para ela e simplesmente procura uma implementação, então é Test First. Se vc tem a especificação, mas não procura apenas uma implementação, vc procura a melhor implementação, o melhor design, etc… isso é TDD. A diferença é o ultimo D = Development. Desenvolver significa que vc ainda não sabe o que precisa ou ainda não melhorou o suficiente para atender outros requisitos além da especificação ( como qualidade, boas práticas, simplicidade, DRY, etc…)