Как правильно запустить покрытие Eclemma с Java - PullRequest
6 голосов
/ 26 февраля 2020

Мы используем не java тесты. Каждый из них выполняет наш инструмент, который написан на Java. Я пытаюсь использовать Eclemma для создания отчета о тестировании. Начнем с одного теста. Мы компилируем код с build.xml. Я хотел бы как-то создать отчет о покрытии для каждого теста, а затем объединить их в один основной отчет. Я обнаружил, что Jacoco имеет интерфейс CMD , который я мог бы использовать для объединения этих отчетов. Но я не понимаю, как запустить инструмент с пакетом покрытия?

  1. Какой пакет покрытия мне следует использовать? Это Eclemma или Jacoco?
  2. Как запустить инструмент с пакетом покрытия? Должен ли я добавить его в файл build. xml? Должен ли я добавить его в командную строку?

Я немного озадачен самой идеей покрытия в Java. В динамических c языках, таких как Python и Perl, я просто выполняю код с модулем покрытия, который создает отчет о покрытии.

Команда, которую мы используем для запуска инструмента:

gandu -vm /usr/pkgs/java/1.6.0.25-64/bin/java -configuration /.ganduData -data /.ganduData -configuration /ganduInternalConfig --session_id 1582722179

Должен ли я добавить некоторые опции?

Сборка в build.xml:

<target name="pde-build" depends="clean, init">
    <java classname="org.eclipse.equinox.launcher.Main" fork="true" failonerror="true">
        <arg value="-application" />
        <arg value="org.eclipse.ant.core.antRunner" />
        <arg value="-buildfile" />
        <arg value="${eclipseLocation}/plugins/org.eclipse.pde.build_${pdeBuildPluginVersion}/scripts/productBuild/productBuild.xml" />
        <arg value="-Dtimestamp=${timestamp}" />
        <classpath>
            <pathelement location="${eclipseLocation}/plugins/org.eclipse.equinox.launcher_${equinoxLauncherPluginVersion}.jar" />
        </classpath>
    </java>
</target>

Должна ли я добавить следующую команду?

<arg value="-autVMArgs" />      
<arg value="-Xmx800m;-XX:MaxPermSize=600M;-javaagent:${jacoco-agent-path}=destfile=${jacoco-report},append=true"/>

Обновление: Благодаря двум ответам мне удалось создать отчет с помощью CLI. Но похоже, что он показывает (почти) нулевое покрытие. Он показывает красный цвет (непокрытый) на напечатанных строках, которые, как я вижу, были выполнены (они были напечатаны на стандартный вывод).

Проект содержит много пакетов, но для первой попытки я пытаюсь создать отчет о покрытии для конкретной c упаковки. Я запустил:

gandu -vm /usr/pkgs/java/1.6.0.25-64/bin/java -configuration /.ganduData -data /.ganduData --session_id 1583967465 -vmargs -Xmx256m -Xms128m -javaagent:/jacoco_coverage/jacoco-0.8.5/lib/jacocoagent.jar

, а затем я запустил:

/usr/pkgs/java/1.6.0.16-64/bin/java -jar /jacoco_coverage/jacoco-0.8.5/lib/jacococli.jar report jacoco.exec --classfiles /gandu_repo/com.core.gandu/bin/ --html temp_dir --sourcefiles /gandu_repo/com.core.gandu/src/

Вывод:

[WARN] Some classes do not match with execution data.
[WARN] For report generation the same class files must be used as at runtime.
[WARN] Execution data for class <PATH> does not match.
[INFO] Analyzing 8 classes.

Мне трудно понять, как classfiles и sourcefiles , Файл, на который я пытаюсь получить покрытие, - Application. В bin у меня есть какая-то внутренняя папка Application.class и в src у меня есть какая-то внутренняя папка Application.java. Я даже пытался добавить полный путь к этим файлам в classfiles и sourcefiles, но все еще не имеет покрытия (все красные). В чем может быть проблема? Структура инструмента: root содержит много пакетов, и у каждого есть папки bin и src. Каждый src рекурсивно содержит папки с Java файлами. bin имеет такую ​​же структуру для файлов class.

1 Ответ

5 голосов
/ 12 марта 2020

Как я знаю, единственное место для добавления агента java - это конфигурация модульных тестов.

Агент должен быть добавлен в JVM, выполняющую приложение в процессе тестирования. Ваша путаница, вероятно, связана с тем, что обычно модульные тесты выполняются в той же JVM, что и тестируемый код.

Из вашего описания неясно, как запускается JVM с приложением.

Однако рассмотрим следующий src/Main.java в качестве примера:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

  public static void main(String[] args) throws Exception {
    String input;
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
      input = reader.readLine();
    }
    if ("hello".equals(input)) {
      System.out.println("Hello, World!");
    }
  }

}

после компиляции

javac -d classes src/Main.java

Это приложение может быть выполнено в JVM с JaCoCo Java Agent взято из JaCoCo zip-дистрибутива следующим образом

java -javaagent:jacoco/lib/jacocoagent.jar -cp classes Main

Затем выполняются тесты - например, в этом случае ввод вручную "hello".

После постепенного завершения JVM вы получите файл jacoco.exec.

Передав эти jacoco.exec, исходные файлы и файлы классов в интерфейс командной строки JaCoCo , вы можете создать HTML отчет:

java -jar jacoco/lib/jacococli.jar report jacoco.exec --classfiles classes --sourcefiles src --html report

report

* 10 40 *

Какой пакет покрытия мне использовать? Это Eclemma или Jacoco?

EclEmma - это плагин для Eclipse IDE на основе JaCoCo.

Если для тестирования вы выполняете свое приложение из Eclipse IDE, то вы можете запустить его с помощью JaCoCo, используя EclEmma. Вот тот же пример, выполненный в Eclipse IDE:

EclEmma

Однако это не подходит для других сценариев ios, таких как сборки Ant.

Как запустить инструмент с пакетом покрытия? Должен ли я добавить его в файл build. xml? Должен ли я добавить его в командную строку?

Это зависит от того, как вы выполняете свое приложение - если для тестов ваше приложение выполняется Ant, то вы можете использовать JaCoCo Ant Tasks для настройки агента и генерации отчета. В качестве примера приведем build.xml для Ant, который выдает тот же отчет для src/Example.java, что и вышеприведенные команды:

<project xmlns:jacoco="antlib:org.jacoco.ant" name="Example Ant Build with JaCoCo" default="rebuild">

  <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
    <classpath path="jacoco/lib/jacocoant.jar"/>
  </taskdef>

  <target name="clean">
    <delete dir="classes"/>
    <delete dir="report"/>
    <delete file="jacoco.exec"/>
  </target>

  <target name="compile">
    <mkdir dir="classes"/>
    <javac srcdir="src" destdir="classes" debug="true" includeantruntime="false"/>
  </target>

  <target name="run" depends="compile">
    <jacoco:agent property="jacocoAgent" />

    <java classname="Main" fork="true">
      <classpath path="classes"/>
      <jvmarg value="${jacocoAgent}"/>
    </java>
  </target>

  <target name="report" depends="run">
    <jacoco:report>
      <executiondata>
        <file file="jacoco.exec"/>
      </executiondata>
      <structure name="JaCoCo Ant Example">
        <classfiles>
          <fileset dir="classes"/>
        </classfiles>
        <sourcefiles encoding="UTF-8">
          <fileset dir="src"/>
        </sourcefiles>
      </structure>
      <html destdir="report"/>
    </jacoco:report>
  </target>

  <target name="rebuild" depends="clean,report"/>

</project>

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

...