При запуске pitest с maven не удается найти или загрузить org.pitest.coverage.execute.CoverageMinion

#java #maven #junit5 #mutation-testing #pitest

#java #maven #junit5 #тестирование мутаций #pitest

Вопрос:

Я изучаю тестирование мутаций с помощью pitest и сталкиваюсь с проблемами, когда пытаюсь запустить его с помощью maven. В моем pom.xml У меня самая жалкая зависимость:

 <dependency>
    <groupId>org.pitest</groupId>
    <artifactId>pitest</artifactId>
    <version>1.5.2</version>
</dependency>
 

У меня также есть плагин:

 <plugin>
    <groupId>org.pitest</groupId>
    <artifactId>pitest-maven</artifactId>
    <version>1.5.2</version>
    <executions>
        <execution>
            <id>pit-report</id>
            <!-- optional, this example attached the goal into mvn test phase -->
            <phase>test</phase>
            <goals>
                <goal>mutationCoverage</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.pitest</groupId>
            <artifactId>pitest-junit5-plugin</artifactId>
            <version>0.12</version>
        </dependency>
    </dependencies>
    <configuration>
        <targetClasses>
            <param>mypackage.myClass*</param>
       </targetClasses>
       <targetTests>
           <param>mypackage*</param>
       </targetTests>
    </configuration>
</plugin>
 

Однако, когда я запускаю mvnw.cmd verify test -Dverbose , он сообщает, что обнаружил механизм мутации, Junit 5 и плагин Junit, добавляет плагин junit 5 в путь к классу, добавляет pitest в путь к классу, а затем не может найти и загрузить основной класс org.pitest.coverage.execute.CoverageMinion и не выполняет никаких тестов на мутации:

 [INFO] --- pitest-maven:1.5.2:mutationCoverage (pit-report) @ myProject ---
[...]
[INFO] Found plugin : Mutant export plugin
[INFO] Found shared classpath plugin : Default mutation engine
[INFO] Found shared classpath plugin : JUnit 5 test framework support
[INFO] Found shared classpath plugin : JUnit plugin
[INFO] Found shared classpath plugin : TestNG plugin
[INFO] Adding org.pitest:pitest-junit5-plugin to SUT classpath
[INFO] Adding org.pitest:pitest to SUT classpath
[INFO] Mutating from C:UsersmyUsermyWorkspacemyProjecttargetclasses
[...]
13:20:27 PIT >> FINE : Running report with ReportOptions [targetClasses=[mypackage.myClass*], excludedMethods=[], excludedClasses=[], excludedTestClasses=[], codePaths=[C:UsersmyUsermyWorkspacemyProjecttargetclasses], reportDir=C:UsersmyUsermyWorkspacemyProjecttargetpit-reports, historyInputLocation=null, historyOutputLocation=null, sourceDirs=[C:UsersmyUsermyWorkspacemyProjectsrcmainjava, C:UsersmyUsermyWorkspacemyProjectsrctestjava], classPathElements=[C:UsersmyUsermyWorkspacemyProjecttargettest-classes, C:UsersmyUsermyWorkspacemyProjecttargetclasses, C:UsersmyUser.m2repositoryorgjunitjupiterjunit-jupiter5.7.0junit-jupiter-5.7.0.jar, C:UsersmyUser.m2repositoryorgjunitjupiterjunit-jupiter-params5.7.0junit-jupiter-params-5.7.0.jar, C:UsersmyUser.m2repositoryorgjunitjupiterjunit-jupiter-engine5.7.0junit-jupiter-engine-5.7.0.jar, C:UsersmyUser.m2repositoryorgjunitplatformjunit-platform-engine1.7.0junit-platform-engine-1.7.0.jar, C:UsersmyUser.m2repositoryorgjunitjupiterjunit-jupiter-api5.7.0junit-jupiter-api-5.7.0.jar, C:UsersmyUser.m2repositoryorgapiguardianapiguardian-api1.1.0apiguardian-api-1.1.0.jar, C:UsersmyUser.m2repositoryorgopentest4jopentest4j1.2.0opentest4j-1.2.0.jar, C:UsersmyUser.m2repositoryorgjunitplatformjunit-platform-commons1.7.0junit-platform-commons-1.7.0.jar, C:UsersmyUser.m2repositoryorgslf4jslf4j-api1.7.30slf4j-api-1.7.30.jar, C:UsersmyUser.m2repositoryorgpitestpitest1.5.2pitest-1.5.2.jar, C:UsersmyUser.m2repositoryorgpitestpitest-junit5-plugin0.12pitest-junit5-plugin-0.12.jar, C:UsersmyUser.m2repositoryorgpitestpitest1.5.2pitest-1.5.2.jar], mutators=[], features=[], dependencyAnalysisMaxDistance=-1, jvmArgs=[-Djava.awt.headless=true], numberOfThreads=1, timeoutFactor=1.25, timeoutConstant=3000, targetTests=[^myPackage.*$], loggingClasses=[], maxMutationsPerClass=0, verbose=true, failWhenNoMutations=true, outputs=[HTML], groupConfig=TestGroupConfig [excludedGroups=[], includedGroups=[]], fullMutationMatrix=false, mutationUnitSize=0, shouldCreateTimestampedReports=true, detectInlinedCode=true, exportLineCoverage=false, mutationThreshold=0, coverageThreshold=0, mutationEngine=gregor, javaExecutable=null, includeLaunchClasspath=true, properties={}, maxSurvivors=0, excludedRunners=[], includedTestMethods=[], testPlugin=junit5, useClasspathJar=false, skipFailingTests=false]
13:20:27 PIT >> FINE : System class path is C:UsersmyUsermyWorkspacemyProject.mvnwrappermaven-wrapper.jar
13:20:27 PIT >> FINE : Maximum available memory is 1796 mb
13:20:27 PIT >> FINE : MINION : Installing PIT agent

13:20:27 PIT >> INFO : MINION : Error: Could not find or load main class org.pitest.coverage.execute.CoverageMinion
 

Изначально я думал, что это будет проблема с путем к классу, учитывая сообщение об ошибке, но приведенные выше журналы показывают, что используемый путь к классу включает соответствующие банки и пути. Что еще я мог делать неправильно? Заранее спасибо.

Комментарии:

1. Вам не нужна зависимость от pitest. Я не уверен, почему это может вызвать проблему, которую вы видите, но что произойдет, если вы ее удалите?

2. @henry В настоящее время я нахожусь вдали от компьютера, на котором у меня есть этот проект, но я попробую завтра, когда вернусь, и соответствующим образом обновлю вопрос, решает ли он проблему или нет. Спасибо за предложение.

3. @henry Я удалил зависимость, и ошибка все равно произошла. Однако проверка переменной окружения classpath показала, что, вопреки моему мнению, она была установлена. Отключение его решило проблему. Время убить несколько мутантов. Еще раз спасибо за вашу помощь.

Ответ №1:

Для тех, кто сталкивается с такой же проблемой, моя ошибка заключалась в том, что я предположил, что путь к классу правильный, но это не так. Похоже, в журналах не учитывается значение переменной среды classpath, и на моем компьютере эта переменная имела значение, когда оно не должно быть установлено. Сброс его с помощью set classpath= решены проблемы с путями к классам, которые вызывали ошибку с помощью pitest.