TDD — Test Driven Development

Olá, devZ.

Está cada vez mais difícil entender os títulos daqui.

Eu sei mas o assunto é importante, confia. TDD ou Test Driven Development é uma técnica de desenvolvimento de Software onde para cada funcionalidade um teste é criado, basicamente, desenvolver a sua aplicação baseada em testes.

O conceito é antigo, se você é um desenvolver PHP talvez não esteja tão familiarizado, diferente da comunidade de Ruby, por exemplo, onde quase todas as vagas para se trabalhar com Rails pedem TDD como pré-requisito, TDD não era tão comum para os desenvolvedores PHP.

Parece interessante, mas parece ser muito trabalhoso…

Será? Você já deve ter passado por isso: Você corrige um bug, abre sua aplicação, um novo bug apareceu em outra parte do sistema. Você deve conhecer alguém que foi contratado para refatorar código uma aplicação antiga, meu “antigo estágio” tinha código de 11 anos, ninguém queria mexer naquele monstro. Com esse background, será que realmente não vale a pena investir tempo em tornar sua aplicação mais sustentável?

Beleza. Mas como isso vai acontecer, Victor?

Tá, vou te dar alguns bons motivos.

  1. Produtividade: Como o desenvolvimento é feito na base de encontrar pequenos bugs e resolvê-los imediatamente. O desenvolver encontra menos problemas durante o desenvolvimento da aplicação, perdendo menos tempo depurando o sistema.
  2. Código Flexível: Para escrever os testes temos que separar pequenas partes do nosso código, tornando elas testáveis. Assim, garantimos que o código esteja menos engessado, a leitura dos testes torna mais fácil a compreensão das funcionalidades do sistema.
  3. Código Limpo: Ao escrever os testes, na sua última etapa devemos refatorar o código, esse costume em realizar o refactor do código torna ele mais claro. O desenvolvedor entende melhor a funcionalidade, aumenta a sua segurança para o concerto de bugs e pode com isso melhorar o desempenho do código.

Ok, testar é importante. Mas como fazer isso?

Beleza. Testar é realmente importante, todo mundo testa, pelo menos no final do desenvolvimento, antes de entregar pro seu cliente você testa a sua aplicação, certo? (Se você já apresentou uma funcionalidade para um cliente sem testar a gente tá dando a mão agora e chorando juntos.) Mas quando testar? Quando se fala de TDD à risca, nós temos três etapas:

Código que funciona => Código simples e limpo => Código rápido.
  1. Red: Melhor Pokemon de Gameboy… Digo, trata-se de escrever o teste antes de implementar o código. Sim, antes. Por isso o nome Red, porque o primeiro teste irá falhar.
  2. Green: Fazemos o teste passar. Você conhece a banda KISS? Você sabia que na verdade ela significa Keep It Simple, Stupid? Basicamente, devemos implementar o mínimo código possível para fazermos o teste passar.
  3. Refactor: Refatorar o código. Simples. Tiramos linhas desnecessárias, encaramos a tela do computador e nos perguntamos se aquela é a melhor maneira de fazer aquilo que estamos fazendo.

Parece estranho? Parece, mas não é. O fato de termos um teste primeiro que o código nos faz desenvolver uma forma simples de passar no teste. Se você conhece o SOLID conhece o conceito de Single Responsability Principle ou princípio de responsabilidade única que diz que uma classe deve ter somente uma responsabilidade. O TDD nos faz respeitar esse princípio para criarmos os testes.

Kent Beck, no seu livro sobre TDD comenta sobre perdermos muito tempo imaginando um Design que seja perfeito para aplicação assim como eu perco muito tempo imaginando a melhor maneira de começar uma frase aqui. Com isso acabamos muitas vezes escrevendo código desnecessário assim como algumas das minhas piadas. No TDD, como queremos que os testes passem, desenvolvemos da forma mais simples possível, respeitando sem perceber um dos pilares do SOLID.

Como conseguimos um código simples? Fazendo um teste passar. Como conseguimos um código claro? Refatorando o código após ele passar. Como conseguimos um código seguro? Com testes.

Para concluir, o Laravel já possui integrado o PHPunit que é um framework de testes da linguagem PHP. O PHPunit possui uma documentação muito boa e em português. What is your excuse?