Использование jmh для тестирования кода без создания отдельного проекта maven

Я работаю над проектом Maven и хочу использовать jmh для тестирования своего кода. Я хочу организовать свой проект так, чтобы он содержал исходный код, модульные тесты и тесты производительности. Похоже, в gradle есть способ протестировать ваш код без создания отдельного проекта Gradle (см. ссылка). Есть ли способ сделать это в Maven?


person JSC    schedule 10.08.2016    source источник


Ответы (1)


Короткий ответ: да.

Я сталкивался с этой компоновкой каталогов в своих проектах (но вы определенно можете ее изменить)

+- src/
   +- main/java   - sources
   +- test/
      +- java        - test sources
      +- perf        - benchmarks

Для этого вам понадобится пара плагинов.

  1. 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>
  1. 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>
  1. 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
comment
В вашем рабочем примере (например, doSomethingTest в ExampleBenchmark.java) лучше избегать цикла for, поскольку он приводит к непредвиденным результатам производительности из-за оптимизации цикла в JVM. - person Denis Weerasiri; 07.06.2017
comment
Наличие src/test/perf помимо src/test/java немного непоследовательно, поскольку последний различает артефакты по технологии (в данном случае java), а первый по назначению (перфоманс). Поскольку тесты, вероятно, тоже написаны на Java, я бы предпочел src/perf/java, как предлагается в этой статье о настройка JMH с помощью Gradle. - person deamon; 09.05.2018