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 引擎配置代码覆盖率,请按照以下步骤操作:
在创建/编辑构建配置时,请转到 构建步骤 页面。
选择 Ant 构建运行程序。
在 代码覆盖率 部分,从下拉菜单中选择 EMMA 作为覆盖工具。
设置覆盖率选项 — 请参考下述的可用选项描述。
选项 | 描述 |
---|---|
将源文件包含在覆盖率数据中 | 勾选此选项以将源文件包含到代码覆盖率报告中(您将能在网页上看到源文件)。 |
覆盖率工具参数 | 使用此字段来指定创建代码覆盖率报告时要使用的过滤器。 这些过滤器定义了要从工具编制中豁免的类。 要了解过滤器的详细描述,请参考 EMMA 文档。 |
故障排查
没有覆盖率,会显示一条消息:EMMA:未创建输出:元数据为空
请确保在构建过程中,所有需要进行覆盖率评估的类都被重新编译。 通常,这需要在构建的开始处添加一个 "clean" 任务。
java.lang.NoClassDefFoundError: com/vladium/emma/rt/RT
此消息出现时,您的构建在运行时加载了 EMMA -工具化的类文件,但在类路径中找不到 emma.jar 文件。 对于测试任务,如 junit
或 testng
,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
。