Я работаю над проектом Maven и хочу использовать jmh для тестирования своего кода. Я хочу организовать свой проект так, чтобы он содержал исходный код, модульные тесты и тесты производительности. Похоже, в gradle есть способ протестировать ваш код без создания отдельного проекта Gradle (см. ссылка). Есть ли способ сделать это в Maven?
Использование jmh для тестирования кода без создания отдельного проекта maven
Ответы (1)
Короткий ответ: да.
Я сталкивался с этой компоновкой каталогов в своих проектах (но вы определенно можете ее изменить)
+- src/
+- main/java - sources
+- test/
+- java - test sources
+- perf - benchmarks
Для этого вам понадобится пара плагинов.
build-helper-maven-plugin
для прикрепления местоположения пользовательских тестовых источников
<execution>
<id>add-test-source</id>
<phase>generate-test-sources</phase>
<goals>
<goal>add-test-source</goal>
</goals>
<configuration>
<sources>
<source>src/test/perf</source>
</sources>
</configuration>
</execution>
maven-compiler-plugin
для запуска _ 5_ обработчик аннотаций наtest-compile
фазе
<execution>
<goals>
<goal>testCompile</goal>
</goals>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</execution>
maven-assembly-plugin
для создания исполняемого jar-файла с тестами
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<attach>true</attach>
<archive>
<manifest>
<mainClass>org.openjdk.jmh.Main</mainClass>
</manifest>
</archive>
</configuration>
</execution>
<assembly>
<id>perf-tests</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>test</scope>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.directory}/test-classes</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>**/*</include>
</includes>
<useDefaultExcludes>true</useDefaultExcludes>
</fileSet>
</fileSets>
</assembly>
После этого вы получите исполняемый файл jar с тестами, который можно будет запускать как обычно.
java -jar target/your-project-version-perf-tests.jar
Вы можете увидеть рабочий пример здесь.
ПРИМЕЧАНИЕ
Единственным недостатком этого решения является то, что все тестовые классы и тестовые зависимости также будут включены в jar с тестами, которые определенно раздувают его. Но вы можете избежать этого, собрав тесты в отдельном (кроме ${project.build.directory}/test-classes
) каталоге.
person
vsminkov
schedule
07.09.2016
В вашем рабочем примере (например, doSomethingTest в ExampleBenchmark.java) лучше избегать цикла for, поскольку он приводит к непредвиденным результатам производительности из-за оптимизации цикла в JVM.
- person Denis Weerasiri; 07.06.2017
Наличие
src/test/perf
помимо src/test/java
немного непоследовательно, поскольку последний различает артефакты по технологии (в данном случае java), а первый по назначению (перфоманс). Поскольку тесты, вероятно, тоже написаны на Java, я бы предпочел src/perf/java
, как предлагается в этой статье о настройка JMH с помощью Gradle.
- person deamon; 09.05.2018