O programador está sempre escrevendo testes. Um if aqui, um var_dump ali... estamos sempre construindo cenários imaginários, preocupados se tudo dará certo no final. Mas, o que acontecerá se esquecermos de remover esse código de teste momentos antes de publicar as alterações? Ou ainda, como podemos amadurecer este processo de forma que cada linha de teste possa ser reaproveitada e aperfeiçoada com o tempo? Essas são perguntas que naturalmente levam o programador a adotar uma metodologia para seus testes. Neste DevCast falamos um pouco sobre uma das mais utilizadas e fundamentais, o teste unitário.
O que são testes unitários?
Os testes unitários procuram aferir a corretude do código, em sua menor fração. Em linguagens orientadas a objetos, essa menor parte do código pode ser um método de uma classe. Sendo assim, os testes unitários são aplicados a esses métodos, a partir da criação de classes de testes.
No código abaixo temos como exemplo uma classe de Pagamento, que possui o método cobrar. Note que cobrar recebe como parâmetro um Cliente.
public class Pagamento {
public void cobrar(Cliente cliente) {
// Remove créditos do cliente
}
}
Sendo assim, poderíamos escrever um teste para esse método, verificando se o saldo do cliente é menor após sua chamada. Como resultado teríamos uma classe de teste, como demonstrado abaixo:
public class PagamentoTest {
@Test
public void testRemoverCreditosCliente() {
Cliente cliente = ClienteDao.getCliente();
float saldoAnterior = cliente.getSaldo();
...
Pagamento pagamento = new Pagamento();
pagamento.cobrar(cliente);
Assert.assertTrue(cliente.getSaldo() < saldoAnterior);
}
}
Por que aplicar alguma metodologia aos testes?
Ao criar classes de testes separamos a verificação da corretude do código das regras de negócio da aplicação, garantindo que este processo não comprometa, de alguma forma, código principal.
Note ainda, que por termos rotinas de testes isoladas conseguimos executá-las diversas vezes. Por fim, classes podem ser modificadas com facilidade e, como consequência, assim também poderão ser os testes os quais elas implementam.
Ferramentas para testes
Existem diversas ferramentas para a criação de testes automatizados. Dentre as mais utilizadas temos as bibliotecas da família [x]Unit, sendo o NUnit e o xUnit para .Net, JUnit para Java, PHPUnit para PHP.
Além de terem a provação da comunidade de programadores, essas bibliotecas podem ser facilmente integradas a diversos IDEs. Na Figura 1 vemos um exemplo, retirado do site oficial da JUnit, que apresenta uma classe de teste, muito similar à que vimos anteriormente.
Estas ferramentas têm implementações para praticamente todas as linguagens. Confira a seção Links úteis para realizar o download daquela mais adequada para o seu ambiente de desenvolvimento.
Sugestão de Conteúdo
- Curso O que é TDD?
- Curso O que é JUnit?
- Artigo Testes unitários com NUnit e NCrunch
- Artigo Qualidade em desenvolvimento Web: PHP com teste unitário