Uważam, że właściwe użycie (lub przynajmniej dokumentacja) JUnit jest bardzo zagmatwane. To pytanie służy zarówno jako odniesienie w przyszłości, jak i prawdziwe pytanie.
Jeśli dobrze zrozumiałem, istnieją dwa główne podejścia do tworzenia i uruchamiania testu JUnit:
Podejście A (styl JUnit 3): utwórz klasę rozszerzającą TestCase i rozpocznij metody testowe słowem test
. Uruchamiając klasę jako test JUnit (w Eclipse), wszystkie metody zaczynające się od słowa test
są automatycznie uruchamiane.
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);
}
}
Podejście B (styl JUnit 4): utwórz „normalną” klasę i dołącz @Test
adnotację do metody. Zauważ, że NIE musisz rozpoczynać metody słowem 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);
}
}
Mieszanie tych dwóch nie wydaje się być dobrym pomysłem, zobacz na przykład to pytanie dotyczące stackoverflow :
Teraz moje pytania:
- Jakie jest preferowane podejście lub kiedy użyjesz jednego zamiast drugiego?
- Podejście B umożliwia testowanie wyjątków poprzez rozszerzenie adnotacji @Test, jak w
@Test(expected = ArithmeticException.class)
. Ale jak testować wyjątki, używając podejścia A? Korzystając z podejścia A, możesz zgrupować kilka klas testowych w zestawie testów w następujący sposób:
TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);
Ale nie można tego użyć z podejściem B (ponieważ każda klasa testowa powinna mieć podklasę TestCase). Jaki jest właściwy sposób grupowania testów dla podejścia B?
Edycja: Dodałem wersje JUnit do obu podejść
extends TestCase
a następnie każdy test został również opatrzony adnotacją,@Test
aby zmylić rzeczy. :)