2013-06-17 14 views
19

Jak mogę ponownie użyć testów JUnit w innej klasie testowej?Jak ponownie wykorzystać istniejące testy JUnit w innej klasie testowej?

Na przykład:

public TestClass1 { 
    @Test 
    public void testSomething(){...} 
} 

public TestClass2 { 
    @Test 
    public void testSomethingAndSomethingElse() { 
     // Somehow execute testSomething() 
     // and then test something else 
    } 
} 
+4

Testy jednostkowe powinny być niezależne/izolowane. Uzależnienie jednego testu od drugiego jest złym pomysłem. – xyz

+2

@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. –

+0

@AaronDigulla: To zły pomysł, a czasami zły jest dobry :) – xyz

Odpowiedz

6

jak zwykle można:

  1. rozszerza TestClass2 z TestClass1
  2. dostępu TestClass1 z TestClass2 pomocą przekazania:

Przykład 1:

// Instantiate TestClass1 inside test method 
public TestClass2 { 
    public void testSomethingAndSomethingElse1() { 
     new TestClass1().testSomething(); 
    } 
} 

Przykład 2:

// Instantiate TestClass1 as a member of TestClass2 
public TestClass2 { 
    private TestClass1 one = new TestClass1(); 
    public void testSomethingAndSomethingElse1() { 
     one.testSomething(); 
    } 
} 
1

Logicznie rzecz biorąc, nie ma powodu, aby połączyć jedną metodę badań od drugiego. Każde narzędzie, które uruchomi jeden test, będzie równie łatwo wykonywać wszystkie testy w pakiecie. Ale jeśli chcesz, możesz to nazwać jak każdą inną metodą w każdej innej klasie.

To, co najprawdopodobniej chcesz zrobić, to wykonać typową konfigurację dla obu metod testowania. Możesz umieścić kod that w metodzie narzędzia we wspólnej klasie i wywołać wspólny kod w obu testach.

+0

użycie case: 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 dla bazy danych, która tworzy połączenie, ładuje początkowy DDL/dane. –

+0

Wstępne ładowanie danych jest krokiem konfiguracyjnym. To nie powinno być częścią przypadku testowego, ale warunkiem wstępnym wszystkich przypadków testowych. –

+0

To około 10% tego, o czym mówiłem. Sprawa testowa będzie zawierała wiele, wielu przypadków testowych, które należy uruchomić dla każdej bazy danych, którą należy obsługiwać. Nie ma sensu powielanie tego kodu. –

25

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.

+1

To, co powiedziałeś, jest prawdziwe w przypadku testów jednostkowych. A co z integracją lub przypadkami testów funkcjonalnych, w których scenariusze dotyczące dzieci są zależne od scenariuszy nadrzędnych, a każde z rodzeństwa jest od siebie niezależne? – supertonsky

+0

To pytanie zostało oznaczone jako "testy jednostkowe", ale w przypadku testów integracyjnych lub funkcjonalnych obowiązuje druga połowa mojej odpowiedzi. Sekcje kodu testowego mogą być udostępniane tylko w tym celu. Kluczem jest uniknięcie wywoływania jednego testu bezpośrednio od innego, zamiast tego przeniesienie udostępnionego kodu do klasy bazowej lub pomocnika. Dzięki temu jest jasne, które sekcje zestawu testów są udostępniane. – seanhodges

Powiązane problemy