TeamCity On-Premises 2024.03 Help

EMMA

EMMA 集成笔记

使用 EMMA 收集覆盖率时,将执行以下步骤:

1. 在每次编译步骤(使用 javac / javac2 )后,构建代理会调用 EMMA 对编译后的类进行工具化并存储源文件的位置。 因此,包含类元数据的 coverage.em 文件将在构建检出目录中创建。 收集的 Java 文件的源路径被用来生成最终的 HTML 报告。

2. 测试运行。 在此阶段,将收集实际的运行时覆盖信息。 这个过程将生成 coverage.ec 文件。 如果有多个测试任务,数据将被追加至 coverage.ec

3. 报告生成。 当构建结束时,TeamCity 会生成一个 HTML 覆盖率报告,创建包含报告的 coverage.zip 文件,并将其上传至服务器。 它还会生成并上传摘要报告到 coverage.txt 文件,以及原始的 coverage.e(c|m) 文件,以允许通过 IntelliJ IDEA 的 TeamCity 插件查看覆盖情况。

使用 EMMA 配置覆盖率

要通过 EMMA 引擎配置代码覆盖率,请按照以下步骤操作:

  1. 在创建/编辑构建配置时,请转到 构建步骤 页面。

  2. 选择 Ant 构建运行程序。

  3. 代码覆盖率 部分,从下拉菜单中选择 EMMA 作为覆盖工具。

  4. 设置覆盖率选项 — 请参考下述的可用选项描述。

选项

描述

将源文件包含在覆盖率数据中

勾选此选项以将源文件包含到代码覆盖率报告中(您将能在网页上看到源文件)。

覆盖率工具参数

使用此字段来指定创建代码覆盖率报告时要使用的过滤器。 这些过滤器定义了要从工具编制中豁免的类。 要了解过滤器的详细描述,请参考 EMMA 文档

故障排查

没有覆盖率,会显示一条消息:EMMA:未创建输出:元数据为空

请确保在构建过程中,所有需要进行覆盖率评估的类都被重新编译。 通常,这需要在构建的开始处添加一个 "clean" 任务。

java.lang.NoClassDefFoundError: com/vladium/emma/rt/RT

此消息出现时,您的构建在运行时加载了 EMMA -工具化的类文件,但在类路径中找不到 emma.jar 文件。 对于测试任务,如 junittestng ,TeamCity 会自动将 emma.jar 添加到类路径中。 但是,对于其他任务,情况并非如此,您可能需要修改您的构建脚本,或者从仪器化中排除一些类。

如果您的构建运行一个使用您自己编译的类的 java 任务,您将需要将 emma.jar 添加到 java 任务的类路径中,或确保在您的 java 任务中使用的类没有被插入工具修改。 此外,您应该使用 fork=true 属性运行您的 java 任务。

相应的 emma.jar 文件可以从 buildAgent / plugins / coveragePlugin / lib / emma.jar 获取。 对于典型的构建,相应的 include 路径将会是 ../../plugins/coveragePlugin/lib/emma.jar

为了从编译中排除类,使用 EMMA 工具任务的设置。 TeamCity UI 包含一个字段,用于将这些参数传递给 EMMA,该字段标签为“覆盖率检测参数”。 要排除一些包不进行检测,请使用以下语法: -ix -com.foo.task.*,+com.foo.*,-*Test* ,其中包 com.foo.task.* 包含您的自定义任务的文件。

EMMA 覆盖率结果不稳定

请确保您的 junit 任务具有 fork=true 属性。 推荐的属性组合是 fork=true forkmode=once

最后修改日期: 16日 7月 2024年