Как исключить занятия из инструментов плагином maven-emma? - PullRequest
2 голосов
/ 29 февраля 2012

У меня есть несколько юнит-тестов (хотя это тесты Android, я использую Robolectric, поэтому они работают на JVM).Они благополучно работают без покрытия.

Я получаю эту ошибку от emma-maven, когда пытаюсь сделать это с покрытием:

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:emma-maven-plugin:1.0-alpha-3:instrument (default-cli) on project android: Execution default-cli of goal org.codehaus.mojo:emma-maven-plugin:1.0-alpha-3:instrument failed: class [com.larvalabs.svgandroid.ParserHelper] appears to be instrumented already

Важный бит class .... appears to be instrumented already.

Очень трудно найти надлежащую документацию, но это то, что я собрал для конфигурации из разных источников:

<plugin>
    <!-- This doesn't work, see below for a working configuration -->
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>emma-maven-plugin</artifactId>
    <version>1.0-alpha-3</version>
    <inherited>true</inherited>                          
    <executions>
            <execution>
                    <phase>process-classes</phase>                               
                    <configuration>
                            <filters>
                                    <filter>-com.viewpagerindicator.*</filter>
                                    <filter>-com.actionbarsherlock.*</filter>
                                    <filter>-com.larvalabs.svgandroid.*</filter>
                            </filters>
                    </configuration>
                    <goals> 
                            <goal>instrument</goal>
                    </goals>
            </execution>
    </executions>
</plugin>

Проблема в том, что я исключил те пакеты, на которые он жаловался (я подумалпроблема заключалась в том, что это проекты библиотек Android, которые по неосторожности дважды заканчивались каким-либо списком путей), теперь они жалуются на мои собственные пакеты.


Коллега неправильно предложила перейти к разделу вышев .

Оказывается, что должен быть непосредственно в , а оставшийся бит должен быть удален, см. ответ.

Ответы [ 3 ]

5 голосов
/ 04 марта 2012

Я нашел решение - смущающе просто.

Забудьте о плагине управления: он «работает» только тогда, когда игнорирует фильтры для / this / pom, но применяет их к любым дочерним poms: http://maven.apache.org/pom.html#Plugin_Management

Просто переместите элемент конфигурации из блока выполнения и удалите блок выполнения.http://maven.apache.org/guides/mini/guide-configuring-plugins.html#Generic_Configuration

С разделом конфигурации, находящимся непосредственно внутри элемента плагина, при запуске с 'mvn -X emma: emma' были показаны перечисленные фильтры.Поскольку каждая строка исключения меняла ошибку, которую я видел, я делаю вывод, что она исключала.(Я понимаю, что включать, добавлять фильтры + префиксов переопределения разделы вышеуказанных -. Префиксов)

1012

До сих пор, как подразумеваемая Android часть вопроса идет (который на самом деле делает фильтрацию довольно спорный вопросдля меня), поскольку Android нужен отдельный APK для проведения тестов и проверки основного приложения APK, вы просто не запускаете интеграционные тесты Android из того же проекта: плагин Android требует, чтобы вы создали интеграционный тест APK из отдельного проекта.- как правило, один и тот же родительский файл под одним и тем же родительским файлом.Есть примеры / примеры проектов в zip-файле, скрывающемся на странице плагина Android - http://code.google.com/p/maven-android-plugin/wiki/Samples, в котором вы должны искать «покрытие» и изменить его на:

<coverage>true</coverage>

в соответствии с конфигурацией -пара примеров есть, но закомментирована.Я отвлекся, поэтому не могу вспомнить, сработало ли это, но оно явно должно.

Поскольку мы не хотели вставлять уровень каталогов в существующий элемент управления исходным кодом нашего проекта, мы создали каталоги с именем 'parent' и«интеграция» в качестве пиров pom.xml приложения с использованием «parent» для хранения родительского pom и «интеграция» для интеграционных тестов. Этот раздел сообщает app / pom.xml, что нужно использовать app / parent / pom.xml:

<project>
    <parent>
            <groupId>our.group.id</groupId>
            <artifactId>base</artifactId>
            <relativePath>parent</relativePath>
            <version>3.9.0</version>
    </parent>

и это в app /gration / pom.xml:

<project>
  <parent>
    <groupId>our.group.id</groupId>
    <artifactId>base</artifactId>
    <relativePath>../parent</relativePath>
    <version>3.9.0</version>
  </parent>
2 голосов
/ 04 марта 2012

Насколько я понимаю, инструментированные классы нужны только cobertura для генерации отчетов. Если вы создадите их в target / classes, они перезапишут исходные файлы классов.

Если в результате вам понадобятся инструментированные файлы в банке, вы можете настроить maven-jar-plugin для получения файлов из каталога target / генерируемых классов вместо или в дополнение к файлы из стандартного $ {build.project.outputDirectory}.

Редактировать

Взгляните на описание maven-jar-plugin. Чтобы использовать только целевые / сгенерированные классы, должно работать следующее дополнение к вашему POM - попробуйте и измените его под свои нужды:

<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3</version> <!-- replace with correct version nbr! -->
        <configuration>
          <includes>
            <include>${project.build.directory}/generated-classes/**/*.class</include>
          </includes>
          <excludes>
            <exclude>${project.build.directory}/classes/**/*.class</include>
          </excludes>

        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

${project.build.directory} указывает на вашу целевую папку, ${project.build.ouputDirectory} на цель / классы. Я не знаю, можете ли вы просто установить ${project.build.ouputDirectory} на новое значение - взгляните на эту главу книги maven , может быть, вы найдете несколько подсказок

См .:

Альтернативно или дополнительно вы можете использовать maven для копирования файлов из целевых / созданных классов в целевые / классы после завершения coberture:instrument. На этот вопрос есть один ответ с примером POM (фрагмент), вам просто нужно определить правильную фазу (ресурсы процесса определенно слишком рано для вашего случая)

А также См. Это

Надеюсь, это поможет.!

0 голосов
/ 03 июля 2017

Пожалуйста, используйте mode = "overwrite". Это будет работать нормально.

...