Eu achei o uso adequado (ou pelo menos a documentação) do JUnit muito confuso. Essa pergunta serve como referência futura e como uma pergunta real.
Se eu entendi corretamente, há duas abordagens principais para criar e executar um teste JUnit:
Abordagem A (JUnit 3-estilo): criar uma classe que se estende TestCase, e comece a métodos de ensaio com a palavra test
. Ao executar a classe como um Teste JUnit (no Eclipse), todos os métodos iniciados com a palavra test
são executados automaticamente.
import junit.framework.TestCase;
public class DummyTestA extends TestCase {
public void testSum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
Abordagem B (estilo JUnit 4): crie uma classe 'normal' e adicione uma @Test
anotação ao método. Note que você não tem que começar o método com a palavra test
.
import org.junit.*;
import static org.junit.Assert.*;
public class DummyTestB {
@Test
public void Sum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
Misturar os dois parece não ser uma boa ideia, veja, por exemplo, esta pergunta sobre o stackoverflow :
Agora, minhas perguntas:
- Qual é a abordagem preferida ou quando você usaria uma em vez da outra?
- A abordagem B permite testar exceções estendendo a anotação @Test como em
@Test(expected = ArithmeticException.class)
. Mas como você testa exceções ao usar a abordagem A? Ao usar a abordagem A, você pode agrupar várias classes de teste em um conjunto de testes como este:
TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);
Mas isso não pode ser usado com a abordagem B (uma vez que cada classe de teste deve subclassificar TestCase). Qual é a maneira correta de agrupar testes para a abordagem B?
Editar: adicionei as versões do JUnit às duas abordagens
extends TestCase
e, em seguida, cada teste também anotou@Test
apenas para confundir as coisas. :)