Mariusz Prowaźnik

o programowaniu w Javie, Scali i Clojure.


Kategorie w testach JUnit

Dobrze zaprojektowany test jednostkowy powinien testować jedną klasę, z zaślepionymi zależnościami (np z EasyMock) i wykonywać się szybko, żeby nie było pokusy ich omijania. Uruchamiając je przy każdym buildzie aplikacji wychwytuje się szybko wiele błędów regresji, co oszczędza dużo czasu.

Jednak JUnit, choć przeznaczony jest głównie do testów jednostkowych, można użyć również do bardziej złożonych testów: integracyjnych, lub wydajnościowych, które wykonuje się rzadziej niż jednostkowe. Tylko trzeba by je jakoś oddzielić od siebie, np. pogrupować w kategorie i stworzyć zestawy (TestSuite) które będą wykonywać poszczególne grupy testów. Wtedy przydatna okazuje się adnotacja @Category, która określa kategorię testu. Kategorią może być dowolna klasa, lub interfejs. Przykładowo:
public interface SlowTest {}
public interface FastTest {}
stworzyłem dwa interfejsy, które użyję jako kategorie testów:
public class SimpleTest {
    @Category(FastTest.class)
    @Test
    public void someTest() {
        // ...
    }

    @Category(SlowTest.class)
    @Test
    public void someTest() {
        // ...
    }
}
oraz TestSuite, w którym oprócz klas testowych określam kategorię testów, jaką ma wykonać:
@RunWith(Categories.class)
@IncludeCategory(FastTests.class)
@SuiteClasses({ SimpleTest.class })
public class SimpleTestSuite {
}
Adnotacją @Category można oznaczać poszczególne metody lub całe klasy. Powyższy przykład wykonuje testy oznaczone kategorią FastTests.class. Odwrotne zachowanie nastąpi po użyciu adnotacji @ExcludeCategory(FastTest.class).

W eclipse można skonfigurować sobie czy mają być wykonywane wszystkie testy, czy na przykład tylko wybrany zestaw (Run Configurations -> JUnit). Myślę, że dosyć wygodnym rozwiązaniem jest stworzyć sobie dwie konfiguracje, jedną uruchamiającą zestaw (TestSuite) z testami o kategorii FastTests i drugą uruchamiającą zestaw z wszystkimi testami.

Brak komentarzy :

Prześlij komentarz