2015-01-07 5 views
1

Проект представляет собой проект с несколькими модулями maven с 90% исходного кода, написанного на Java (в Scala есть небольшой бит). Модульные тесты - 80/20 java/scala, а интеграционные тесты - 20/80 java/scala.Получение покрытия кода для Java-кода с помощью тестов scala

Я пробовал клевер, но (at this time) он не поддерживает scala.

Я пробовал Jacoco. Сначала у меня возникли проблемы с получением каких-либо результатов из-за конфигурации mutli-модуля, но теперь с использованием Sonar у меня появилось покрытие java (спасибо http://www.aheritier.net/maven-failsafe-sonar-and-jacoco-are-in-a-boat/). Я использовал timezra (http://timezra.blogspot.com/2013/10/jacoco-and-scala.html) с jacoco, но это только проанализировало небольшой бит исходного кода, который является scala.

Я начал пробовать Scoverage, но у меня, похоже, такая же проблема, как timezra (он анализирует scala-to-scala, а не микс, который у меня есть). Я поэтому даже не пробовал scct или undercover.


Есть ли какой-либо инструмент, который обрабатывает смешанные java/scala?

+0

Эмма работает с инструментами байт-кода, так что, возможно, это сработает? Однако я не пробовал. – lmm

ответ

2

Я предлагаю иметь два отдельных инструмента покрытия для Java и Scala. В частности, используйте Scoverage для Scala (с plugin for Sonar).

Причина заключается в том, что для Java вы, вероятно, хотели бы измерить охват линии где для Scala это гораздо лучше измерять охватзаявления. Просто сказано, потому что в Scala есть много операторов в одной строке, и вы хотите измерить, какие из них были вызваны. Я написал an article about this.

+0

Два отдельных инструмента покрытия не работают для меня. То, что я нахожу, заключается в том, что с проверкой моих тестов scala на Java-код инструменты охвата выполняют только java-java или scala-scala. – GrandVizier

+0

Как вы используете два инструмента? Если я запускаю jacoco, например, в проекте, это дает мне плохое покрытие во всем scala. Как вы проинтерпретируете два результата, чтобы получить рабочий результат? –

1

, чтобы ответить на мой собственный вопрос, Jacoco анализирует покрытие для тестов Scala и кода Java. Я не видел ничего, что делает наоборот (но у нас нет тестов Java для кода Scala, так что это не имело значения).

Что касается объединения покрытия, то ответ Rado на использование двух инструментов имеет смысл.


Вот изменения, которые я сделал для моего пом, чтобы получить покрытие. Примечание, я создаю Jacoco отчеты, когда тест выполняется, а потом с помощью эхолота для более глубокого анализа:

свойства:

<!-- Jacoco and Sonar config properties --> 
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin> 
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis> 
    <jacoco.version>0.7.2.201409121644</jacoco.version> 
    <sonar-jacoco-listeners.version>1.4</sonar-jacoco-listeners.version> 

    <jacoco.outputDir>${basedir}/target/</jacoco.outputDir> 
    <jacoco.out.ut.file>jacoco-ut.exec</jacoco.out.ut.file> 
    <jacoco.out.it.file>jacoco-it.exec</jacoco.out.it.file> 

    <sonar.jacoco.reportPath>${jacoco.outputDir}/${jacoco.out.ut.file}</sonar.jacoco.reportPath> 
    <sonar.jacoco.itReportPath>${jacoco.outputDir}/${jacoco.out.it.file}</sonar.jacoco.itReportPath> 

Отказоустойчивость:

 <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-failsafe-plugin</artifactId> 
     <version>2.17</version> 
     <configuration> 
      <argLine>-Xms512m -Xmx1024m ${jacoco.agent.it.arg}</argLine> 
      <properties> 
      <property> 
       <name>listener</name> 
       <value>org.sonar.java.jacoco.JUnitListener</value> 
      </property> 
      </properties> 
      <reportsDirectory>${jacoco.outputDir}/surefire-reports</reportsDirectory> 
     </configuration> 
     <executions> 
      <execution> 
      <goals> 
       <goal>integration-test</goal> 
       <goal>verify</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin>   

jacoco:

 <plugin> 
     <groupId>org.jacoco</groupId> 
     <artifactId>jacoco-maven-plugin</artifactId> 
     <version>${jacoco.version}</version> 
     <executions> 
      <execution> 
      <id>prepare-ut-agent</id> 
      <phase>process-test-classes</phase> 
      <goals> 
       <goal>prepare-agent</goal> 
      </goals> 
      <configuration> 
       <destFile>${sonar.jacoco.reportPath}</destFile> 
       <propertyName>jacoco.agent.ut.arg</propertyName> 
       <append>true</append> 
      </configuration> 
      </execution> 
      <execution> 
      <id>prepare-it-agent</id> 
      <phase>pre-integration-test</phase> 
      <goals> 
       <goal>prepare-agent-integration</goal> 
      </goals> 
      <configuration> 
       <destFile>${sonar.jacoco.itReportPath}</destFile> 
       <propertyName>jacoco.agent.it.arg</propertyName> 
       <append>true</append> 
      </configuration> 
      </execution> 
      <execution> 
      <id>default-report</id> 
      <phase>package</phase> 
      <goals> 
       <goal>report</goal> 
      </goals> 
      <configuration> 
       <dataFile>${sonar.jacoco.reportPath}</dataFile> 
      </configuration> 
      </execution> 
      <execution> 
      <id>integration-report</id> 
      <phase>post-integration-test</phase> 
      <goals> 
       <goal>report-integration</goal> 
      </goals> 
      <configuration> 
       <dataFile>${sonar.jacoco.itReportPath}</dataFile> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 

surefire:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.17</version> 
      <configuration> 
      <argLine>${jacoco.agent.ut.arg} -Xms512m -Xmx1024m</argLine> 
      <skipTests>false</skipTests> 
      <properties> 
       <property> 
       <name>listener</name> 
       <value>org.sonar.java.jacoco.JUnitListener</value> 
       </property> 
      </properties> 
      <reportsDirectory>${jacoco.outputDir}/surefire-reports</reportsDirectory> 
      </configuration> 
     </plugin> 

добавлены зависимости:

<dependency> 
     <groupId>org.codehaus.sonar-plugins.java</groupId> 
     <artifactId>sonar-jacoco-listeners</artifactId> 
     <version>${sonar-jacoco-listeners.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.sonar.plugins</groupId> 
     <artifactId>sonar-surefire-plugin</artifactId> 
     <version>3.3.2</version> 
     <scope>test</scope> 
    </dependency> 
0

можно увидеть сочетание покрытия двух языков. С помощью сонара невозможно, потому что он анализирует только один вид языка.

Если вы используете jenkins и настраиваете шаг, который собирает отчеты о покрытии (Jacoco), вы увидите смешение двух языков.

Смежные вопросы