Jak uruchomić testy porównawcze JMH w ramach istniejącego projektu przy użyciu testów JUnit? Oficjalna dokumentacja zaleca wykonanie oddzielnego projektu z wykorzystaniem wtyczki Maven shade i uruchomienie JMH w metodzie main
. Czy jest to konieczne i dlaczego jest zalecane?Jak uruchomić JMH z wewnętrznych testów JUnit?
Odpowiedz
Używam JMH wewnątrz mojego istniejącego projektu Maven przy użyciu JUnit bez widocznych złych efektów. Nie mogę odpowiedzieć, dlaczego autorzy zalecają robienie różnych rzeczy. Nie zaobserwowałem różnicy w wynikach. JMH uruchamia oddzielną wirtualną maszynę wirtualną, aby uruchamiać testy porównawcze w celu ich izolowania. Oto co mam zrobić:
Dodaj zależności JMH do POM:
<dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId> <version>1.9.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-generator-annprocess</artifactId> <version>1.9.3</version> <scope>test</scope> </dependency>
Zauważ, że umieściłem je w zakresie
test
.W środowisku Eclipse konieczne może być ręczne skonfigurowanie procesora adnotacji. NetBeans obsługuje to automatycznie.
Utwórz klasę JUnit i JMH. Zdecydowałem się połączyć obie w jedną klasę, ale to zależy od ciebie. Zauważ, że to, co faktycznie określa, które testy będą uruchamiane z twojego testu JUnit, to
OptionsBuilder.include
!public class TestBenchmark { @Test public void launchBenchmark() throws Exception { Options opt = new OptionsBuilder() // Specify which benchmarks to run. // You can be more specific if you'd like to run only one benchmark per test. .include(this.getClass().getName() + ".*") // Set the following options as needed .mode (Mode.AverageTime) .timeUnit(TimeUnit.MICROSECONDS) .warmupTime(TimeValue.seconds(1)) .warmupIterations(2) .measurementTime(TimeValue.seconds(1)) .measurementIterations(2) .threads(2) .forks(1) .shouldFailOnError(true) .shouldDoGC(true) //.jvmArgs("-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintInlining") //.addProfiler(WinPerfAsmProfiler.class) .build(); new Runner(opt).run(); } // The JMH samples are the best documentation for how to use it // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/ @State (Scope.Thread) public static class BenchmarkState { List<Integer> list; @Setup (Level.Trial) public void initialize() { Random rand = new Random(); list = new ArrayList<>(); for (int i : LoopUtils.range (1000)) list.add (rand.nextInt()); } } @Benchmark public void benchmark1 (BenchmarkState state, Blackhole bh) { List<Integer> list = state.list; for (int i = 0; i < 1000; i++) bh.consume (list.get (i)); } }
procesor adnotacji JMH wydaje się nie działać dobrze z kompilacji na zapisywanie w NetBeans. Podczas modyfikowania testów wydajności może być konieczne wykonanie pełnej wersji
Clean and Build
. (Wszelkie sugestie docenione!)Przeprowadź test
launchBenchmark
i obejrzyj wyniki!------------------------------------------------------- T E S T S ------------------------------------------------------- Running net.almson.util.TestBenchmark # JMH 1.9.3 (released 12 days ago) # VM invoker: C:\Program Files\Java\jdk1.8.0_45\jre\bin\java.exe # VM options: <none> # Warmup: 2 iterations, 1 s each # Measurement: 2 iterations, 1 s each # Timeout: 10 min per iteration # Threads: 2 threads, will synchronize iterations # Benchmark mode: Average time, time/op # Benchmark: net.almson.util.TestBenchmark.benchmark1 # Run progress: 0.00% complete, ETA 00:00:04 # Fork: 1 of 1 # Warmup Iteration 1: 2.984 us/op # Warmup Iteration 2: 3.007 us/op Iteration 1: 2.844 us/op Iteration 2: 2.832 us/op Result "benchmark1": 2.838 us/op # Run complete. Total time: 00:00:05 Benchmark Mode Cnt Score Error Units TestBenchmark.benchmark1 avgt 2 2.838 us/op Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.255 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
Runner.run
nawet zwracaRunResult
obiektów, na których można zrobić twierdzeń itd
- 1. Grupowanie testów JUnit
- 2. Jak uruchomić Junit TestSuites z gradle?
- 3. Jak uruchomić wszystkie zmodyfikowane klasy testowe JUnit?
- 4. Jak wyprowadzać informacje dotyczące debugowania z wewnętrznych testów funkcjonalnych?
- 5. Jak używać testów maven i jUnit?
- 6. Odbicie dla testów wewnętrznych właściwości urządzenia
- 7. Ignorując AspectJ podczas testów JUnit
- 8. Netbeans i tworzenie testów JUnit
- 9. Jak uruchomić serię testów NUnit?
- 10. Android usługa uruchomiona przez nie testów JUnit
- 11. Uruchamianie sparametryzowanych testów JUnit równolegle w Eclipse
- 12. Uruchamianie zestawu testów JUnit przy użyciu Maven
- 13. Jak korzystać z VisibleForTesting dla czystych testów JUnit
- 14. Running skrzyżowanie testów z wykorzystaniem JUnit i Maven
- 15. Nie można uruchomić jUnit z Eclipse
- 16. zajęcia uniemożliwiają zastosowanie/CommandLineRunner z wykonaniem podczas testów JUnit
- 17. Jak mogę uruchomić testy JUnit w losowej kolejności?
- 18. Uruchamianie testów JUnit z Eclipse daje ClassNotFound błąd
- 19. Nie można uruchomić testów mokka z żaglami
- 20. Nie można uruchomić testów nunit z teamcity
- 21. Lepsze lub niestandardowe filtrowanie JUnit do testów
- 22. Uruchamianie testów ogórka z kategoriami Junit za pośrednictwem Maven
- 23. Zarządzanie danymi testowymi dla testów Junit
- 24. Jak uruchomić wszystkie przypadki testowe JUnit z NetBeans?
- 25. Jak uruchomić oba testy ScalaTest i JUnit z Gradle?
- 26. Jak generować metody w benchmarkach jmh?
- 27. Jak korzystać z "wewnętrznych" pakietów?
- 28. jak wyeksportować (JUnit) zestaw testów jako plik wykonywalny
- 29. Jak logować wyniki testów junit do bazy danych
- 30. pokrycie kodu dla testów wtyczek junit z maven
Nie jest to opcja zalecana uruchomić testy pod JMH. Testy jednostkowe i inne IDE kolidują z pomiarami. Zrób to bezpośrednio z linii poleceń. –
@IvanVoroshilin Próbowałem to w obie strony i nie widziałem różnicy w wynikach. Czy masz konkretne porady, w jakich warunkach to staje się problemem? –
Wyniki są mniej wiarygodne, to tylko zalecenie. Wyeliminuj czynniki zewnętrzne. To przeszkadza, jeśli chodzi o mikrobezpieczenie. –