Фильтровать классы в муравье при использовании pitest
Давайте рассмотрим этот простой пример муравья + питеста: https://github.com/hcoles/pitest-ant-example
Путь к классам теста определяется следующим образом:
<!-- classpath for compiling and testing the code. Note it does not include pitest and it's dependencies -->
<path id="test.path">
<pathelement location="${classOutputDir}/classes" />
<pathelement location="${classOutputDir}/test-classes" />
<pathelement location="lib/junit-4.9.jar" />
</path>
Теперь, допустим, я хочу изменить его, чтобы отфильтровать некоторые классы. Например, я хочу включить только тестовые классы, название которых начинается с "Частично":
<path id="test.path">
<pathelement location="${classOutputDir}/classes" />
<fileset dir="${classOutputDir}/test-classes">
<include name="**/Partially*.class" />
<exclude name="**/ExcludedTest*.class" />
</fileset>
<pathelement location="lib/junit-4.9.jar" />
</path>
К сожалению, это решение дает мне следующую ошибку:
pit:
[pitest] Exception in thread "main" org.pitest.util.PitError: error in opening zip file (/root/pitest-ant-example/build/test-classes/com/example/PartiallyTestedTest$1.class)
[pitest]
[pitest] Please copy and paste the information and the complete stacktrace below when reporting an issue
[pitest] VM : Java HotSpot(TM) 64-Bit Server VM
[pitest] Vendor : Oracle Corporation
[pitest] Version : 25.161-b12
[pitest] Uptime : 354
[pitest] Input ->
[pitest] BootClassPathSupported : true
[pitest]
[pitest] at org.pitest.util.Unchecked.translateCheckedException(Unchecked.java:25)
[pitest] at org.pitest.classpath.ArchiveClassPathRoot.getRoot(ArchiveClassPathRoot.java:120)
[pitest] at org.pitest.classpath.ArchiveClassPathRoot.getData(ArchiveClassPathRoot.java:46)
[pitest] at org.pitest.classpath.CompoundClassPathRoot.getData(CompoundClassPathRoot.java:27)
[pitest] at org.pitest.classpath.ClassPath.getClassData(ClassPath.java:97)
[pitest] at org.pitest.classpath.ClassPathByteArraySource.getBytes(ClassPathByteArraySource.java:41)
[pitest] at org.pitest.classinfo.Repository.querySource(Repository.java:82)
[pitest] at org.pitest.classinfo.Repository.nameToClassInfo(Repository.java:68)
[pitest] at org.pitest.classinfo.Repository.fetchClass(Repository.java:60)
[pitest] at org.pitest.mutationtest.config.ConfigurationFactory.createConfiguration(ConfigurationFactory.java:52)
[pitest] at org.pitest.mutationtest.config.LegacyTestFrameworkPlugin.createTestFrameworkConfiguration(LegacyTestFrameworkPlugin.java:38)
[pitest] at org.pitest.mutationtest.config.SettingsFactory.getTestFrameworkPlugin(SettingsFactory.java:133)
[pitest] at org.pitest.mutationtest.config.SettingsFactory.createCoverageOptions(SettingsFactory.java:142)
[pitest] at org.pitest.mutationtest.tooling.EntryPoint.execute(EntryPoint.java:80)
[pitest] at org.pitest.mutationtest.tooling.EntryPoint.execute(EntryPoint.java:45)
[pitest] at org.pitest.mutationtest.commandline.MutationCoverageReport.runReport(MutationCoverageReport.java:87)
[pitest] at org.pitest.mutationtest.commandline.MutationCoverageReport.main(MutationCoverageReport.java:45)
[pitest] Caused by: java.util.zip.ZipException: error in opening zip file
[pitest] at java.util.zip.ZipFile.open(Native Method)
[pitest] at java.util.zip.ZipFile.<init>(ZipFile.java:225)
[pitest] at java.util.zip.ZipFile.<init>(ZipFile.java:155)
[pitest] at java.util.zip.ZipFile.<init>(ZipFile.java:169)
[pitest] at org.pitest.classpath.ArchiveClassPathRoot.getRoot(ArchiveClassPathRoot.java:118)
[pitest] ... 15 more
BUILD FAILED
/root/pitest-ant-example/build.xml:109: /root/pitest-ant-example/build.xml:109: Java returned: 1
Total time: 2 seconds
Файл /root/pitest-ant-example/build/test-classes/com/example/PartiallyTestedTest$1.class
действительно существует.
Что я делаю неправильно? Как я могу отфильтровать тестовые классы, которые я хочу использовать?
2 ответа
Когда вы переходите от простого 'pathelement' к более сложному 'fileset', вы также изменяете время, когда путь к классам оценивается.
Простой 'pathelement' просто указывает муравью включить каталог, но не просматривал этот каталог при определении пути.
Более сложный набор файлов оценивается в тот момент, когда путь используется впервые. В этот момент внутренний класс (тот, который содержит $) не существует. Таким образом, класс отсутствует во время выполнения.
Вы должны использовать хитрость, чтобы путь оценивался в нужное время, после того как внутренний класс был сгенерирован.
Вам не нужно удалять вещи из пути к классам, чтобы выбрать тесты для запуска или классы для изменения. Питест предоставляет свои собственные фильтры.
В последних версиях это
- targetClasses
- targetTests
- excludedClasses
- excludedTests
Каждый принимает список глобусов.
Использование плагина Ant описано здесь: http://pitest.org/quickstart/ant/