Unikaj scenariusza. Jest skłonny sprawić, by testy były bardziej kruche. Jeśli TestClass1
nie powiedzie się, wówczas TestClass2
niejawnie nie powiedzie się, co nie jest pożądane dla co najmniej następujących powodów:
- Code jest testowana więcej niż jeden raz, który marnuje czas wykonania.
- Testy nie powinny polegać na sobie nawzajem, powinny być rozłączone jak to tylko możliwe.
- Jeśli stanie się to wzorem, trudniej będzie zidentyfikować, który fragment kodu został złamany, sprawdzając, które testy zawodzą, co jest częścią punktu testów
Okazjonalne udostępnianie sekcji kodu testowego jest przydatne, szczególnie w przypadku testów integracyjnych. Oto w jaki sposób można to zrobić bez zależności od testów siebie:
public abstract BaseTests {
protected void somethingHelper() {
// Test something
}
}
public TestClass1 extends BaseTests {
@Test
public void testSomething(){
somethingHelper();
}
}
public TestClass2 extends BaseTests {
@Test
public void testSomethingAndSomethingElse() {
somethingHelper();
// and then test something else
}
}
Alternatywnie, można użyć klasy pomocnika i uniknąć spadku w ogóle. Potwierdzenia i tym podobne można zastosować w metodzie somethingHelper()
.
Nie wywoływać bezpośrednio metody od TestClass1
w TestClass2
. Przypadki testowe stają się mniej czytelne w ten sposób i mogą prowadzić do spaghetti frittata.
Testy jednostkowe powinny być niezależne/izolowane. Uzależnienie jednego testu od drugiego jest złym pomysłem. – xyz
@Karna: przypadek użycia: Twoja aplikacja/framework obsługuje kilka baz danych. więc masz jedną podstawową klasę testową, która zawiera testy dla wszystkich funkcji i jedno rozszerzenie na bazę danych, która tworzy połączenie, ładuje początkowe DDL/dane, itp. –
@AaronDigulla: To zły pomysł, a czasami zły jest dobry :) – xyz