2012-02-07 13 views
37

W zeszłym tygodniu stworzyłem dwie klasy, które mój zespół wyraził obawy dotyczące ich działania. Aby ocenić mój kod, napisałem kilka prostych testów JUnit, które wykorzystywały te klasy, budując bogate zbiory danych testowych, a następnie zasilając te dane odpowiednimi metodami dla tysięcy iteracji. Zarejestrowałem środowisko wykonawcze każdej iteracji, a następnie wylogowałem się z wysokiego, niskiego i średniego czasu, używając pętli i System.nanoTime(). W końcu JUnit stwierdził, że wysokie i średnie czasy mieściły się w dopuszczalnych granicach. Ta metoda testowania dała zespołowi zaufanie do tego kodu.Czy JUnit jest odpowiednim narzędziem do pisania testów wydajności?

Czy JUnit jest odpowiednim narzędziem do testowania wydajności w ten sposób? Czy istnieją lepsze narzędzia do testowania wydajności na poziomie jednostki (metody i klasy)?

Odpowiedz

37

Może istnieć lepsze podejście, ale istnieją także pewne ramy, które pomagają wdrożyć test porównawczy z JUnit. Niektóre przydatne praktyki to przebiegi rozgrzewkowe, oceny statystyczne. Spójrz na JUnitBenchmarks i JUnitPerf

EDIT wygląda JUnitBenchmarks została zaniechana, ponieważ pytanie zostało powiedziane. Opiekunowie projektu zalecają przejście na JMH. Dziękuję, Barry NL za heads-up.

+1

Zaakceptowałem to, ponieważ ja i mój zespół mamy silne powiązanie z integracją JUnit z tymi opcjami. @Pangea miał świetną odpowiedź na testy porównawcze bez integracji Junit. – Freiheit

+1

Nasz projekt wdrożył już JUnit dla wszystkich naszych testów jednostkowych. Rozszerzenie ich na testy wydajności w ramach JUnitPerf było bardzo łatwe i miało sens. –

+0

Fajnie, cieszę się, że ta odpowiedź jest nadal przydatna :) – kostja

21

Nie. JUnit jest przeznaczony do testowania jednostkowego. Istnieje wiele rzeczy, które należy zadbać podczas pisania testów wydajności w Javie. Użyj Google Caliper, który jest specjalnie zaprojektowany do pisania testów mikro-testów.

Spójrz How do I write a correct micro-benchmark in Java?

+0

Dokładnie to, co miałem zamiar polecić :) – Brice

+0

Google Caliper nie wydaje się być udanym projektem. Wciąż są w fazie beta od 2 lat. – JeanValjean

6

wynikach badań powinno być lepiej zdefiniowane jako testów porównawczych. Tak, JUnit może być używany w ten sposób, chociaż nie jest najlepszym wyborem. Ale możesz na przykład zdefiniować maks. czas oceny dla testu, więc jeśli algorytm zostanie zmieniony, który spowodował spadek wydajności, test kończy się niepowodzeniem. Użyj konfiguracji @Test(timeout=12345).

Jeśli potrzebujesz prawdziwego testu wydajności, pomyśl o JMeter.

-5

JUnit jest bardziej przeznaczony dla testów jednostkowych, może TestNG będzie lepszym wyborem w tej sprawie, w szczególności jego @Dataprovider cecha:

//This method will provide data to any test method that declares that its Data Provider 
//is named "test1" 
@DataProvider(name = "test1") 
public Object[][] createData1() { 
return new Object[][] { 
    { "Cedric", new Integer(36) }, 
    { "Anne", new Integer(37)}, 
}; 
} 

//This test method declares that its data should be supplied by the Data Provider 
//named "test1" 
@Test(dataProvider = "test1") 
public void verifyData1(String n1, Integer n2) { 
System.out.println(n1 + " " + n2); 
} 

Oto specific doc.

+2

JUnit obsługuje bardzo podobne @Parameterized. – nes1983

Powiązane problemy