Também queria saber do pessoal sobre isso:
Vocês tem conseguido aplicar o TDD de forma razoavelmente rigorosa?
[/quote]
Depende do que voce considera rigorosa. Sim, eu tenho aplicado e tem funcionado. O TDD em si é bem simples, a dificuldade está em tentar por testes em algo complexo, isso torna os testes complexos. Simplifique o modelo e os testes ficarao simples.
[quote=gomesrod]
Eu particularmente tenho dificuldades para me adaptar ao modo de pensar do TDD, especialmente quanto aos “small steps”, é difícil olhar só para o passo atual sem planejar mais à frente. Acabo escrevendo um teste que pega a funcionalidade quase completa do método que estou criando, e depois preciso escrever uma grande quantidade de código para passar o teste.
Acho essa mudança mais difícil do que passar da programação procedural para OOP…[/quote]
É muito dificil julgar baseado em alguns parágrafos sem ver nada de código, mas o teu comentário me passa a impressão de que você está com problemas de atribuição de responsabilidade nos seus objetos. Se você pega a funcionalidade completa e tenta testar e tem dificuldade em separar isso, talvez elas estejam emaranhadas umas nas outras.
Vamos supor que voce tenha na sua mais alta camada um metodo que executa uma tarefa extremamente complexa. Ainda que ela, por força da regra de negócio, seja extremamente complexa, ela irá executar uma série de tarefas bem definidas. Se cada passo é bem definido, você tem em cada um desses passos, algo simples. E são nesses passos que estarão seus testes.
Lógico, nada impede que você tenha testes que integrem estas partes e confirmem que juntas elas estão funcionando corretamente, mas haverá testes unitários para cada um dos passos simples que irão compor a tarefa complexa.
O foco dos small steps não é necessáriamente no teste, mas na prórpia funcionalidade que você está implementando. E como disse o Xandy, para fazer a parte você terá que entender o todo, mas entender os small steps é compreender que esse todo é divido em partes e cada uma delas pode ser testada.
Supondo que você queira fazer uma venda().
La no mais alto ponto de abstracao voce terá um vender(), que recebera as informacoes vindas do usuario, como o que, para quem, a que preço, em que condições, com quais restricoes e etc…
Nesse vender(), podem estar muitos passos como:
estoque suficiente
cliente mora em uma regiao que permite entrega expressa
cliente nao possui pendencia financeira com a empresa
cliente tem direito a 10% de desconto para compras acima de 1000 reais
E assim por diante. Cada passo desse é independente do outro e pode ser testado separadamente. E se algum deles puder se subdividir, essas subdivisoes tambem podem ser testadas isoladamente. Note que para saber se o cliente mora em determinada regiao, nao se precisa saber se ele esta comprando alguma coisa ou nao. Ele mora ou não mora. Se ha estoque suficiente, há e pronto, nenhuma dessas funcionalidades precisa saber porque esta sendo chamada. Elas são independentes.
E você concentra seus testes nas partes independentes primeiro. Depois voce pode, e deve, integra-las, mas as responsabilidades estarão isoladas e sendo testadas separadamente.