segunda-feira, 10 de dezembro de 2007

JUnit4 - Novidades e Melhorias

Neste fim de semana estava trabalhando em uma aplicação pessoal e tentei usar o JUnit4 para criar meus testes.

Primeiro que tive uma surpresa ótima, os meus métodos de teste criados para JUnit3 funcionam no JUnit4.

O JUnit4 veio com uma aplicação muito forte de Annotations, irei listar as que vi e percebi serem de maior importância:

@Test - O JUnit4 somente necessita da annotation @Test para identificar um método de teste.
@Before e @After - Outras novidades são as annotations @Before e @After, como o nome já diz, são métodos invocados antes e depois dos métodos de teste.

Ainda sobre a annotation @Test, esta recebe parâmetros e 2 que descobri são realmente incríveis:

expected - este parâmetro serve para testar Exception, somente é necessário informar na annotation qual Exception é esperada e pronto: @Test(expected=IOException.class).
timeout - este serve testar tempo de execução do teste, onde o teste falha se demorar mais que o tempo informado: @Test(timeout=2000).

Com JUnit4, uma classe de teste não extende TestCase e seus métodos não precisam começar com "test", como já foi dito, usa-se @Test.

Foram adicionados 2 novos asserts:

O assertEquals com um par de arrays que podem ser passados como parâmetro, desta forma o método verifica cada elemento: assertEquals(Object[] o1, Object[] o2);
E o assertEquals que recebe um primeiro parâmetro String e um par de arrays, este primeiro parâmetro aparece ao lado do erro, caso o teste falhe, permitindo a identificação da linha exata onde o teste falhou: assertEquals(String message, Object[] obj1, Object[] obj2);

Um exemplo básico e que mostra o que deve ser feito para que sua classe de teste feita em JUnit3 se adeque a nova versão do JUnit:
 0: //Com JUnit3
1: public class HelloWorld extends TestCase
2: {
3: //necessita do prefixo "test"
4: public void testSoma()
5: {
6: // Testa se 1+1=2:
7: assertEquals (2, 1+1);
8: }
9: }
10:
11: //Com JUnit4
12: public class HelloWorld //Não extend TestCase
13: {
14: @Test
15: //não precisa ter este nome, poderia ser soma()
16: public void testSoma()
17: {
18: // Testa se 1+1=2:
19: assertEquals (2, 1+1);
20: }
21: }