【问题标题】:How can I share clover coverage data between maven and IntelliJ如何在 Maven 和 IntelliJ 之间共享三叶草覆盖率数据
【发布时间】:2014-04-16 00:54:58
【问题描述】:

我有一个多模块 项目。我使用 作为我的 IDE。 我为 Maven 配置了 插件以在构建时自动检测。 如何让 IntelliJ 识别这些更改并刷新其覆盖数据。(注意:必须单击“刷新覆盖”工具栏按钮。)

我试过像这样配置 ma​​ven-clover2-plugin

  <plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-clover2-plugin</artifactId>
    <version>3.2.2</version>
    <configuration>
      <baseDir>${project.basedir}</baseDir>
      <cloverMergeDatabase>
        ${project.basedir}.clover\cloverMerge.db
      </cloverMergeDatabase>
    </configuration>
    <executions>
      <execution>
        <id>main</id>
        <phase>package</phase>
        <goals>
          <goal>instrument</goal>
          <goal>aggregate</goal>
          <goal>check</goal>
        </goals>
      </execution>
      <execution>
        <id>site</id>
        <phase>pre-site</phase>
        <goals>
          <goal>instrument</goal>
          <goal>aggregate</goal>
          <goal>check</goal>
        </goals>
      </execution>
      <execution>
        <id>clean</id>
        <phase>clean</phase>
        <goals><goal>clean</goal></goals>
      </execution>
    </executions>
  </plugin>

然后我将我的项目设置配置为使用:
.clover\cloverMerge.db 并选中相对于项目目录。复选框。

但这没有用。

注意:
Configuring Instrumentation 的底部它说
如果您有一个多模块项目,请不要明确设置这些位置。
因此,我还尝试将该位置保留为 Maven 和 IDEA 的默认位置,但这也不起作用。

同样在Clover for IDEA installation GUIDE - Known Issues

如果您使用的是 Maven 构建工具,则应避免使用与 Maven 相同的 > IntelliJ 输出目录。由于 Maven 使用 target/classestarget/test-classes 目录,
避免指定这些。 IntelliJ 的 clover.db 位置也应该不同于 Maven 使用的位置。

为什么他们应该是不同的是否存在一些文件损坏问题?如果它们保持不同,那么如何我可以得到很棒的覆盖突出显示/等,而不必在一个完全独立的过程中重复构建?

【问题讨论】:

  • 您有什么具体原因没有使用 IDEA 的内置构建器编译代码并使用 Clover-for-IDEA 插件为其生成代码覆盖率吗?
  • 因为当我为部署构建应用程序时,我使用的是 maven。我更愿意从我部署的相同构建过程中进行测试,而不是使用不同的构建过程。

标签: maven intellij-idea clover java maven intellij-idea clover


【解决方案1】:

好吧,我终于想出了一个答案。我把这个留给后代。

解决方案很复杂,有点像 Hack,但它可行

  1. 更新父项目pom.xml文件

    • cloverDB:&lt;cloverDatabase&gt;${project.basedir}.clover\clover.db&lt;/cloverDatabase&gt;
    • 合并 CloverDB:
      <cloverMergeDatabase> ${project.basedir}.clover\cloverMerge.db </cloverMergeDatabase>
  2. 创建要在 IntelliJ IDEA

    中运行的单元测试
    • 设置启动前 - 运行 Maven 目标
      clean clover2:setup prepare-package -DSkipTests
  3. 创建 Maven 运行配置
    • 使单元测试成为启动前条件
    • 在命令行中运行 Maven clover2:aggregrate
  4. 更新 Intellij 项目设置以使 clover 指向合并文件
    • 确保选中相对于项目目录。复选框。
    • InitString用户指定,其值与您的 pom 文件相同。
      就我而言:.clover\cloverMergeDB
  5. 命令运行后,只需单击Referesh Coverage 图标即可查看并使用idea 中的覆盖率数据。
    • 如果测试失败,您还可以使用漂亮的 IntelliJ 测试运行器选项卡 找出原因。

【讨论】:

  • 你的 hack 看起来不错。但是,我认为您可以对其进行一些优化。您可以在 cloverDatabase 标记中定义绝对路径,而不是让 cloverDatabase + cloverMergeDatabase + 使用 clover2:aggregate 来合并数据库。这将导致 Clover 将其数据存储在同一个 clover.db 文件中,用于所有检测的模块。多亏了这一点,您不必调用 clover2:aggregate。
  • 但是有一个缺点。对所有模块使用一个 clover.db 可能会对大型项目的性能产生一些影响(因为在一次构建期间必须多次更新数据库文件)。这取决于您的硬件和代码库大小,但我想说的是,对于少于 500 个模块和少于 1 个 MLOC 的项目,性能下降并不显着。
  • 也可以使用 Maven 运行配置来执行测试,例如:“clean clover2:setup test”。但是,您必须在 Clover 的“测试运行”视图而不是 IDEA 的测试运行器选项卡中查看测试结果。
【解决方案2】:

在配置检测的底部它说 如果您有一个多模块项目,请不要明确设置这些位置。

文档实际上说:如果您有一个多模块项目,请不要显式设置这些位置(使用绝对路径)原因很简单 - 如果您使用绝对路径,那么您将不会为每个模块都有一个单独的 clover.db,而只有一个 clover.db 文件。

“如果您使用 Maven 构建工具,则应避免使用与 Maven 相同的 IntelliJ 输出目录。由于 Maven 使用 target/classes 和 target/test-classes 目录,请避免指定这些目录” [ ...] 为什么要区分它们是否存在文件损坏问题?

问题如下: IntelliJ IDEA 使用自己的引擎编译源码。这意味着它不必调用原始项目的构建系统(例如 Maven)来编译源代码。

这意味着: - 如果你有一个基于 Maven 的项目并且它安装了 Clover-for-Maven 插件并且 - 同时你在 IntelliJ IDE 中安装了 Clover-for-IDEA - 这两个 Clover 集成对类和数据库使用相同的输出文件夹

... 那么这两个 Clover 集成可能会开始覆盖它们的文件。

在大多数情况下,这不是所期望的行为,因为 IDEA 中的任何源代码修改/项目重建操作等都会触发源重新编译;可以删除之前 Clover-for-Maven 得到的结果。

【讨论】:

  • 重建应该只添加更多覆盖数据。它应该只是一个干净类型的操作,应该会清除数据。
  • IDEA 会在源文件被修改后重新编译它。由于该文件具有新内容,因此之前为其记录的覆盖率数据(无论是 Clover-for-Maven 还是 Clover-for-IDEA)都已过时。因此,应再次检测此类文件并再次记录该文件的代码覆盖率。
  • 顺便说一句:在 Clover-for-Eclipse 中有一个选项是否清除项目重建时的所有覆盖数据(窗口 > 首选项 > Clover > 重建项目时...)。 Clover-for-IDEA 没有这样的选项,但是您可以定义是否在 Clover 的某些选项发生更改时触发完全重建(在“文件 > 设置 > Clover(项目设置)> 编译选项卡 > 重建设置”中)。您还可以指定如何刷新数据(Clover 设置 > 查看选项卡 > 刷新策略)或应加载旧的覆盖文件(Clover 设置 > 查看选项卡 > 跨度)。
猜你喜欢
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多