章节目录:
简介
您可以在对运行的应用程序执行手动或自动功能测试期间监控和收集覆盖率数据。您还可以将覆盖率数据和测试结果发送给 DTP,对数据进行合并和关联。应用程序覆盖率信息可以显示在 DTP 覆盖率浏览器中(请参阅 DTP 用户手册中的“覆盖率浏览器”一章),帮助您了解应用程序的测试情况以及测试质量。
前提条件
可以针对 Java 1.8 - 17 收集运行时覆盖率。
Java JDK 8 的字节码换行计算与之前的 Java 版本不一致。这可能导致覆盖率结果不一致。
如果您希望覆盖率报告仍包含应用程序源代码的信息,则需要以下组件:
- Apache Maven、Gradle 或 Ant 构建系统
如果您使用源码控制系统,需确保您的源码控制设置配置正确;请参阅源码控制设置。
jtestcov
工具要求在您的机器上安装 Java 11 或更高版本。同时支持 Oracle Java SE 和 OpenJDK。其他免费和开源实现可能会影响覆盖率工具的正常运行。建议设置 JAVA_HOME 并添加到系统 PATH 中。有关 jtestcov
用法的信息,请参阅创建覆盖率报告并将数据上传到 DTP 和 jtestcov 的命令行选项。
过程概述
Jtest 自带一个名为覆盖率代理的组件。覆盖率代理连接到被测应用程序(AUT),并在 AUT 运行期间监控正在执行的代码。当覆盖率代理与 AUT 连接时,将公开一个REST API,用于标记每个测试和测试会话的开始和结束。
可覆盖代码行的元数据(静态覆盖率数据)收集通过在应用程序构建过程运行专用测试配置或者扫描应用程序二进制文件实现。在测试执行期间,与覆盖率代理的交互会写入动态覆盖率映射,其中包含指定了哪些代码行被执行的标签。
Jtest 会处理动态覆盖率映射和静态覆盖率数据。生成包含覆盖率信息的 coverage.xml 文件并将发送给 DTP。当 DTP 接收到覆盖率数据时,这些数据会加载到覆盖率图像中,这是一个特殊的标签,能够聚合具有相同构建 ID 的运行所产生的覆盖率数据。覆盖率图像能够将覆盖率信息与特定测试关联。
Jtest 还可以收集应用程序覆盖率,其中只包括运行时覆盖率和有关已执行类的一般信息,除了已被覆盖的行之外,不包括与类结构相关的任何详细信息。然后会发送一份简化版报告,并将其附加到 DTP 上已有的覆盖率数据中。如果 DTP 上已经有关于类结构的信息(静态覆盖率数据),则可以查看覆盖率数据。
测试结果也会从执行测试的工具(即 SOAtest、手动测试等)以 report.xml 文件的形式发送至 DTP。如果覆盖率数据文件和报告的构建 ID 匹配,DTP 就能关联数据并显示覆盖率信息。
您可以使用 jtestcov
或 jtestcli
创建覆盖率报告并将数据上传到 DTP。jtesctcov
是一个覆盖率专用工具,在收集、合并和创建覆盖率报告方面提供更多选项。详细信息,请参阅创建覆盖率报告并将数据上传到 DTP。jtestcov.jar 文件位于 <INSTALL_DIR>/integration
目录中。jtestcov
是一个独立工具,可以在 Jtest 安装目录中复制并单独使用。因此,您可以轻松将该工具集成到您的测试流程中。有关 jtestcov
命令行选项的信息,请参阅 jtestcov 的命令行选项。
配置被测应用程序以获取覆盖率
被测应用程序(AUT)准备步骤如下:
- 可选:生成包含预设覆盖率代理配置和静态覆盖率文件(包括关于用户类、方法和代码行的元数据)的 monitor 包;请参阅生成 monitor 包。
- 配置覆盖率代理以收集运行时覆盖率;请参阅配置覆盖率代理。
- 关联覆盖率代理和 AUT;请参阅关联覆盖率代理与 AUT。
生成 monitor 包
monitor 包是由 Maven、Gradle 或 Ant 的 Jtest 插件在构建过程中创建的。为了确保覆盖率与 AUT 的源代码正确匹配,需使用用于构建 AUT 的相同构建系统和 Java 版本生成包。
包中包含以下文件:
- static_coverage.xml - 包含静态覆盖率信息的文件,
- agent.jar - Jtest Java 覆盖率代理 jar 包。此文件从
<INSTALL_DIR>/integration/coverage
目录拷贝。 - agent.properties - 包含构建过程中生成的范围参数和其他属性的代理设置文件,
- agent.sh/agent.bat - 生成关联代理与 AUT 进程所需的 Jtest Java 代理 VM 参数的脚本。
- opentelemetry-javaagent.jar 和 jtest-otel-ext.jar - 在多用户覆盖率模式中使用的文件:原始 OpenTelemetry Java 代理及其 Jtest 扩展。此扩展用于收集将收集到的覆盖率数据分配给特定用户所需的信息。这些文件从
<INSTALL_DIR>/integration/coverage
目录拷贝。
此包必须在包含源代码的构建机器上生成,在代码变更之前可以使用。
在 AUT 的主目录中执行相应命令可以生成此包:
Maven
mvn package jtest:monitor
Gradle
gradle assemble jtest-monitor -I [INSTALL]/integration/gradle/init.gradle
Ant
ant -lib [INSTALL]/integration/ant/jtest-ant-plugin.jar -listener com.parasoft.Listener jtest-monitor
Ant 要求在执行 monitor 任务之前编译所有类。在构建前修改您的项目并配置任务,确保顺序正确。以下示例展示了如何配置目标:
<target name="jtest-monitor" depends="compile"> <jtest:monitor/> </target>
将生成 monitor.zip 包并放在构建输出目录中。控制台中会打印该位置的路径。
配置覆盖率代理
应用程序服务器通常包含多个应用程序。此外,不需要对通用服务器类或应用程序库插桩。Jtest 只需要收集应用程序源代码的覆盖率。对所有类进行插桩十分耗时。
由于服务器上的应用程序已经构建完成,我们无法收集有关哪些类来自源代码的信息。因此正确设置覆盖率代理的范围非常重要。
您可以通过以下方式配置覆盖率代理:
- agent.properties 文件
- 连接覆盖率代理和 AUT 时传给
-javaagent
的参数;请参阅关联覆盖率代理与 AUT。
agent.properties 和 agent.jar 文件位于 <INSTALL_DIR>/integration/coverage
目录中。agent.properties 文件包含默认属性,可以通过修改这些属性来配置覆盖率代理。以下示例展示了如何使用 agent.properties 文件配置覆盖率代理:
jtest.agent.autostart=false jtest.agent.serverEnabled=true jtest.agent.includes=com/myapp/** jtest.agent.runtimeData=[...]
如果有生成的 monitor.zip 包,可以使用包中的 agent.properties 文件,其中已经包含在构建过程中生成的范围参数和其他属性(请参阅生成 monitor 包)。
在命令行中对将属性添加到 -javaagent
需要删除属性名中的“jtest.agent”前缀,例如:
-javaagent:"[path to agent dir]\agent.jar"=settings="[path to agent properties file]\agent.properties",autostart=true
重要提示
作为 -javaagent
的参数提供的属性会覆盖 agent.properties 文件中配置的属性。在上述示例中,autostart=true
将覆盖 agent.properties 文件中的 jtest.agent.autostart=false
。
下表描述了可用于配置覆盖率代理的所有属性:
属性 | 描述 |
---|---|
jtest.agent.runtimeData | 指定运行时数据的存储位置。以下示例将在‘C:/tmp/myapp/’目录中创建带
|
jtest.agent.includes | 以逗号分隔的模式列表,用于指定要插桩的类。支持以下通配符:
在以下示例中,将对
|
jtest.agent.excludes | 以逗号分隔的模式列表,用于指定要从插桩中排除的类。支持以下通配符:
在以下示例中,
|
jtest.agent.autostart | 启用/禁用运行时数据的自动收集;默认为 true 。 |
| 启用/禁用覆盖率会话的远程访问。 |
jtest.agent.port | 设置代理通信端口;默认为 8050 。 |
jtest.agent.debug | 启用/禁用控制台的详细输出;默认为 false 。 |
jtest.agent.collectTestCoverage | 启用/禁用测试用例的覆盖率信息收集。默认值为 false 。 |
jtest.agent.enableMultiuserCoverage | 启用/禁用多个用户的 Web 应用程序覆盖率收集;默认值为 |
| 启用/禁用 |
jtest.agent.testId | 指定运行代理时,覆盖率将关联的初始测试 ID。 |
jtest.agent.testcaseId | 指定运行代理时,覆盖率将关联的初始测试用例 ID。 |
jtest.agent.enableJacoco | 启用/禁用 Jacoco 引擎的代码行覆盖率收集。 |
jtest.agent.silentMode | 启用/禁用在控制台打印代理介绍;默认值为 false 。 |
jtest.agent.doNotFailOnVerification | 启用/禁用验证失败时终止插桩;默认值为 true 。 |
关联覆盖率代理与 AUT
- 可选:如果要使用 monitor.zip 包:
- 将包中内容提取到服务器机器中。
运行 monitor 包中的 agent.sh/agent.bat 脚本,生成 Jtest Java 代理 VM 参数。脚本在控制台中输出
-javaagent
VM 参数。
使用 -javaagent 标签连接代理和 AUT,将生成 runtime_ 子目录:
Jtest Agent VM argument: -javaagent:"[path to agent dir]\agent.jar"=settings="[path to agent properties file]\agent.properties",runtimeData="[path to runtime coverage folder]"
有关使用
-javaagent
配置覆盖率代理的详细信息,请参阅配置覆盖率代理。- 将
-javaagent
标签添加到应用程序启动脚本中以连接代理和 AUT。连接覆盖率代理和 AUT 后将公开用于控制代理的 REST API。 - 重启 AUT(请参阅 Web 应用覆盖率教程中步骤 5 的第 3 点)。
- 在浏览器中输入以下 URL,验证覆盖率代理是否设置成功:
[application_host]:8050/status/
如果应用程序配置正确,API 将返回数据:
通过 HTTPS 连接覆盖率代理
默认情况下,覆盖率代理可通过 HTTP 协议使用。要通过 HTTPS 连接,您需要向 Jtest 代理 VM 参数添加以下选项来配置覆盖率代理(请参阅关联覆盖率代理与 AUT):
useSSL=true
certificateStorePath=[密钥库文件的路径]
certificateStorePassword=[密钥库文件的密码]
certificateStoreType=[密钥库文件的格式]
certificateKeyPassword=[SSL 证书的密码]
添加到应用服务器启动脚本的 Jtest 代理 VM 参数可能类似于:
-javaagent:"[path to agent dir]\agent.jar"=settings="[path to agent properties file]\agent.properties",runtimeData="[path to runtime coverage folder]",useSSL=true,certificateStorePath="F:\certificates\keystore.jks",certificateStorePassword=4!ij?ffQMk,certificateStoreType="JKS",certificateKeyPassword=dhW!34
这样,覆盖率代理将能识别您为被测应用程序配置的 SSL 证书。
提示
可以通过有多种方法为应用程序配置 SSL 证书。如果使用浏览器,可以找到一个将您的证书添加到受信任证书列表中的选项。如果使用其他 Java 程序,可以将证书导入 Java VM 受信任证书文件中,或者将以下 Java VM 参数添加到 Java 客户端命令行:
-Djavax.net.ssl.trustStore=[密钥库文件的路径]
-Djavax.net.ssl.trustStoreType=[密钥库文件的格式]
-Djavax.net.ssl.trustStorePassword=[密钥库文件的密码]
执行测试以收集运行时覆盖率
收集运行时覆盖率的步骤:
- 您可以使用 SOAtest 来运行功能测试。执行测试时,SOAtest 将收集运行时覆盖率,并将数据上传到 DTP。有关执行测试会话的详细信息,请参阅 SOAtest 用户指南。
- 您可以使用连接的覆盖率代理对应用程序执行测试。覆盖率将被收集到运行时覆盖率目录中。接下来,您需要将运行时覆盖率与静态覆盖率合并,并将合并的数据上传到 DTP。详细信息,请参阅创建覆盖率报告并将数据上传到 DTP。
将测试结果上传到 DTP
按照以下步骤将已执行测试的测试结果上传到 DTP:
- 前往 DTP 界面的报告中心。
- 点击齿轮图标并选择报告中心设置> 附加设置> 报告中心管理> 工具> 数据收集器上传表单(需要管理员权限)。
- 点击选择文件并找到 report.xml 文件。
- 点击上传按钮,将文件上传至 DTP。
如果使用 SOAtest,测试结果会在测试执行期间自动发送到 DTP。请参阅 https://docs.parasoft.com 中 SOAtest 用户指南的应用程序覆盖率部分。
创建覆盖率报告并将数据上传到 DTP
您可以使用 jtestcov
或 jtestcli
命令创建覆盖率报告并将数据上传到 DTP。有关 jtestcov
命令行选项的信息,请参阅 jtestcov 的命令行选项。
可以生成 3 种类型的覆盖率报告:
- 静态和运行时覆盖率报告:包含合并的静态覆盖率(包括源代码信息)和运行时覆盖率的报告。要创建此报告,需使用
-runtimeCoverage
和-staticCoverage
选项运行jtestcli
,或使用-runtime
和-static
选项运行jtestcov
。 - 应用程序覆盖率报告:通过扫描应用程序二进制文件和运行时覆盖率创建的静态覆盖率报告。要创建此报告,需使用
-app
和-runtime
选项运行jtestcov
。 - 运行时覆盖率报告:简化的应用程序覆盖率报告,其中只包括运行时覆盖率和有关已执行类的一般信息,除了已被覆盖的行之外,不包括与类结构相关的任何详细信息。如果 DTP 中已经存在应用程序或基于静态覆盖率的数据,则可以查看该报告。要创建此报告,需使用
-runtime
选项运行jtestcov
。
按照以下步骤创建覆盖率报告并将数据上传到 DTP。
- 确保已正确配置 Jtest,包括 DTP、范围和作者设置。请参阅连接 DTP、向 DTP 发送结果和发布源代码、配置。
- 在 jtestcov.properties(位于
<INSTALL_DIR>/integration/coverage
目录)或 jtestcli.properties 文件中配置以下设置,以便正确合并覆盖率数据:
-report.coverage.images
- 指定用于在 DTP 中创建覆盖率图像的一组标签。覆盖率图像为唯一标识符,用于汇总具有相同构建 ID 的各个运行的覆盖率数据。对于每份报告,DTP 最多支持三个覆盖率图像。
-session.tag
- 为测试运行指定唯一标识符,用于区分同一构建的不同运行。
-build.id
- 指定用于标记结果的构建标识符。该标识符可能对于每个构建而言都是唯一的,但也可能用于标记在指定构建期间执行的多个测试会话。 - 如果您想使用
jtestcli
,则将运行时覆盖率和静态覆盖率文件复制到同一台机器上,并使用以下选项运行jtestcli
:-runtimeCoverage
:指定使用覆盖率代理收集的运行时覆盖率数据的路径。您可以提供包含单个测试会话覆盖信息的 .data 文件的路径,或包含多个测试会话 .data 文件的文件夹路径。-staticCoverage
:指定静态覆盖率文件的路径(请参阅生成 monitor 包)。-config
:指定为合并覆盖率数据必须运行的Calculate Application Coverage
测试配置。-publish
:将合并的覆盖率发送到 DTP。jtestcli -staticcoverage [path to static_coverage.xml file] -runtimecoverage [path/dir] -config "builtin://Calculate Application Coverage" -publish
这可以确保 Jtest 能够访问测试执行期间生成的运行时覆盖率数据,以及静态覆盖率数据,以便将运行时覆盖率数据填充到 coverage.xml 文件中。
- 如果您想使用
jtestcov
,可以使用以下选项运行jtestcov
:-app
:指定被测应用程序所在的目录或压缩文件的路径。-runtime
:指定使用覆盖率代理收集的运行时覆盖率数据的路径。您可以提供包含单个测试会话覆盖信息的 .data 文件的路径,或包含多个测试会话 .data 文件的文件夹路径。-static
:指定静态覆盖率文件的路径(请参阅生成 monitor 包)。-publish
:将合并的覆盖率发送到 DTP。示例 1:基于 monitor 的运行时数据和静态覆盖率生成报告
java -jar jtestcov.jar -static [path to static_coverage.xml file] -runtime [path/dir] -publish -settings [path to jtestcov.properties]
示例 2:基于应用程序二进制文件的运行时数据和覆盖率生成报告
java -jar jtestcov.jar -app [path/dir] -runtime [path/dir] -publish -settings [path to jtestcov.properties]
示例 3:基于运行时数据生成报告
java -jar jtestcov.jar -runtime [path/dir] -publish -settings [path to jtestcov.properties]
如果要合并之前生成的运行时覆盖率报告,则运行
jtestcov merge
命令。要合并两个或多个报告,需运行java -jar jtestcov.jar merge -coverage <REPORT_FILE> -coverage <REPORT_FILE> [-coverage <REPORT_FILE>] [-report <REPORT_DIR>] [-excludeunmatchedruntime]
-coverage <REPORT_FILE>:
指定要合并和发送到 DTP 的一个或多个输入覆盖率报告。-report <REPORT_DIR>
:(可选)在指定文件夹生成 xml 覆盖率报告。默认情况下,报告存储在 .coverage/reports 文件夹中。
如果使用 SOAtest,静态和运行时覆盖率数据会在测试执行期间合并,然后发送到 DTP。请参阅 https://docs.parasoft.com 中 SOAtest 用户指南的应用程序覆盖率部分。
在 DTP 中查看覆盖率
您可以使用 DTP 中的覆盖率浏览器来查看测试执行期间实现的应用程序覆盖率。有关查看覆盖率信息的详细信息,请参阅 https://docs.parasoft.com 中的 Parasoft DTP 用户指南。
已知局限性
- 如果多个用户同时访问同一个 Web 应用程序,他们收集的覆盖率数据可能会混在一起。要确保覆盖率与某个用户正确关联,必须启用多用户模式(请参阅配置覆盖率代理)。
- 在多用户模式下,“默认”用户(未指定 ID 的用户)可能会额外收集到访问同一 web 应用程序的其他用户的覆盖率信息。
- 在多用户模式下,针对多线程应用程序收集的覆盖率在某些情况下可能不会分配给各个用户。这与 OpenTelemetry 在线程间上下文共享方面的限制有关。
- 在多用户模式下,不支持使用 Jacoco 引擎收集覆盖率。
- 为 Web 应用程序初始化收集的覆盖率数据不会分配给特定用户,而是分配给“默认”用户。
jtestcov 的命令行选项
该部分提供 jtestcov
的命令行选项列表。
coverage
默认命令。扫描应用程序和运行时覆盖率数据,以生成覆盖率报告。要生成报告,需运行:
java -jar jtestcov.jar coverage [-app <APP_LOCATION> | -static <BASE_COVERAGE_REPORT_FILE>] [-runtime <RUNTIME_COVERAGE_LOCATION>] [-report <REPORT_DIR>] [-deleteruntime] [-excludeunmatchedruntime]
-app <APP_LOCATION>
指定被测应用程序(AUT)目录或压缩文件(war、ear、jar、zip)的位置。
-static <BASE_COVERAGE_REPORT_FILE>
指定包含 AUT 的覆盖率基数的 XML 覆盖率报告文件。
-runtime <RUNTIME_COVERAGE_LOCATION>
指定针对 AUT 执行测试期间生成的运行时覆盖率目录的位置。
-report <REPORT_DIR>
将 XML 覆盖率报告生成到指定文件夹。可选参数;默认情况下,报告存储在 .coverage/reports 文件夹中。
-deleteruntime
删除用于生成覆盖率 XML 报告的运行时覆盖率数据文件。
如果存在此参数,将在创建报告后删除运行时覆盖率数据文件。
-excludeunmatchedruntime
排除与覆盖率基准中包含的类不匹配的运行时覆盖率数据。
如果该参数存在,任何不匹配的运行时覆盖率数据都将从最终覆盖率报告中剔除。
impacted
扫描应用程序并分析基准覆盖率报告,以查找需要重新运行的测试。要为受影响的测试生成 LST 文件,需运行:
java -jar jtestcov.jar impacted -app <APP_LOCATION> -baseline <BASELINE_COVERAGE_REPORT FILE> [-report <LST_FILE_DIR>]
-app <APP_LOCATION>
指定被测应用程序(AUT)目录或压缩文件(war、ear、jar、zip)的位置。
-baseline <BASELINE_COVERAGE_REPORT_FILE>
指定用作基准的 XML 覆盖率报告。
-report <LST_FILE_DIR>
在指定位置生成 LST 文件。已经存在的 LST 文件将被覆盖。可选参数;默认情况下,报告存储在 coverage/lsts 文件夹中。
merge
合并以前生成的运行时覆盖率报告。要合并两个或多个报告,需运行:
java -jar jtestcov.jar merge -coverage <REPORT_FILE> -coverage <REPORT_FILE> [-coverage <REPORT_FILE>] [-report <REPORT_DIR>] [-excludeunmatchedruntime]
-coverage <REPORT_FILE>
指定要合并和发送到 DTP 的一个或多个输入覆盖率 XML 报告。
-report <REPORT_DIR>
将 XML 覆盖率报告生成到指定文件夹。可选参数;默认情况下,报告存储在 .coverage/reports 文件夹中。
help
显示 jtestcov
帮助。
其他参数:
-include <PATTERN>
-exclude <PATTERN>
指定在 AUT 扫描期间包含/排除元素的模式。可选参数;默认情况下,接受所有元素。
-publish
将生成的报告上传到 DTP 服务器。(设置模式:report.dtp.publish=true)
-settings <SETTINGS_FILE>
从文件中读取自定义配置。<SETTINGS_FILE> 应是包含 <KEY=VALUE> 条目(.properties)的已有配置文件。
-property
指定自定义配置条目。您可以多次使用 -property(如果有多个条目包含相同的键,那么指定的第一个条目将覆盖后续所有条目)。
-showdetails
增加输出信息的详细程度。
(设置模式:console.verbosity.level=high)
jtestcov 退出码
进程在退出时会返回以下退出码之一:
退出码 | 含义 |
---|---|
1 | 进程因异常退出。检查错误日志。 |