本主题介绍如何将 SOAtest 用作 Parasoft 应用程序覆盖率工作流程的一部分。有关使用应用程序覆盖率解决方案的完整信息,请参阅Collecting Coverage for Web Applications指南。章节目录:
前言
Parasoft 应用程序覆盖率解决方案使您能够在对运行中的应用程序执行测试时测量应用程序代码覆盖率。您可以从单个运行中的应用程序或由多个后端服务组成的应用程序中收集覆盖率(可以在执行相同测试用例时从所有后端服务中收集覆盖率)。这样,您就能衡量现有测试套件的有效性,确定哪些地方需要添加额外的测试,并随着应用程序的开发更高效地执行测试。您可以利用用于 Java 或 dotNET 的 SOAtest 随附的覆盖率代理收集应用程序覆盖率,从而在执行测试期间监控应用程序。
收集静态和动态覆盖率数据并将其上传到 DTP 进行查看。
- 静态覆盖率数据是对应用程序中所有源代码的描述。
- 静态覆盖率文件可通过使用 Jtest 或 dotTEST 分析项目源代码(首选方法)或使用 SOAtest 随附的覆盖率工具分析应用程序二进制文件来创建。
- 静态覆盖率文件由创建这些文件的工具(即 Jtest/dotTEST 或覆盖率工具)上传到 DTP。
- 动态(运行时)数据是覆盖率代理在测试执行过程中收集的覆盖率数据。该数据用于判断测试执行时覆盖了哪些代码。
- 运行时覆盖率数据由 SOAtest 收集并上传到 DTP。
- 数据在 DTP 上自动合并。
以下步骤描述了使用 SOAtest 的应用程序覆盖率工作流程:
- 生成静态覆盖率文件。当您可以访问应用程序源代码时,应使用 Jtest 或 dotTEST 生成 .xml 或 .data 格式的静态覆盖率文件,因为与其他方法相比,这种方法具有一些优点。在无法访问应用程序源代码时,您也可以使用 SOAtest 随附的覆盖率工具分析应用程序二进制文件,生成静态覆盖率文件。更多信息,请参阅下面的生成静态覆盖率文件。
- 为被测应用程序(AUT)附加覆盖率代理。覆盖率代理随 SOAtest 一起提供,您可以利用覆盖率代理监控 AUT 运行期间执行的代码。
- 配置 SOAtest 以连接到覆盖率代理,收集运行时覆盖率并将数据上传至 DTP。
- 使用 SOAtest 执行测试,作为自动化流程的一部分。
- 在覆盖率浏览器中查看 DTP 中的应用程序覆盖率。
SOAtest 2023.1 生成并上传到 DTP 的覆盖率报告需要发送给 DTP 2023.1。更早版本的 DTP 无法正确处理 SOAtest 2023.1 生成的覆盖率报告。
生成静态覆盖率文件
如果可以访问应用程序源代码,则应尽可能使用 Jtest 或 dotTEST 生成 .xml 或 .data 格式的静态覆盖率文件。这种方法有几个优点,包括包含有关用户类、方法和行的元数据,以及在 DTP 中查看覆盖率结果时支持显示有覆盖率数据注释的源代码。有关使用这些工具生成静态覆盖率文件的更多信息,请参阅 docs.parasoft.com 的 Jtest 或 dotTEST 用户指南。
您也可以使用 SOAtest 随附的覆盖率工具生成静态覆盖率文件,但会缺少上述使用源代码的优点。为此,您需要独立于 SOAtest 运行该工具,并在运行时传递二进制文件、过滤器、许可证和其他属性(请参阅下面的许可证属性文件示例)。使用 Jtest 覆盖率工具(jtestcov)对 Parabank 进行测试的示例如下:
java -jar jtestcov.jar -soatest -app c:/<PATH_TO_APPLICATION>/parabank.war -include com/parasoft/parabank/parasoft/** -settings c:/<PATH_TO_LICENSE_FILE>/license.properties
覆盖率工具使用 -soatest
标志来传递 SOAtest 许可证,这针对独立于 SOAtest 运行覆盖率工具的情况而言是必需的,如上面的示例所示。在使用应用覆盖率设置运行 soatestcli 时,覆盖率工具启动时会自动传递许可证。运行以下命令可查看所有可用命令和选项:java -jar jtestcov.jar help
# === LICENSE === # === END USER LICENSE AGREEMENT === # Set to true to accept the Parasoft End User License Agreement (EULA). # Please review the EULA.txt file included in the product installation directory. #parasoft.eula.accepted=false # === LOCAL LICENSE === # Enables local license - be sure to specify password. #jtest.license.use_network=false # Specifies password for the local license. #jtest.license.local.password=[LICENSE PASSWORD] # === NETWORK LICENSE === # Enables network license - be sure to configure DTP server settings. #jtest.license.use_network=true # Specifies type of the network license (edition). # Supported editions: desktop_edition, desktop_compliance_edition, server_edition, server_compliance_edition #jtest.license.network.edition=server_edition # Enables specific list of license features #jtest.license.network.edition=custom_edition #jtest.license.custom_edition_features=Jtest, Automation, Desktop Command Line, DTP Publish, Coverage, Test Impact Analysis # === DTP SERVER SETTINGS === # Specifies URL of the DTP server in the form https://host[:port][/context-path] #dtp.url=https://localhost:8443 # Specifies user name for DTP server authentication. #dtp.user=admin # Specifies password for DTP server authentication - use jtestcli -encodepass <PASSWORD> to encode the password, if needed. #dtp.password=admin # Specifies name of the DTP project - this settings is optional. #dtp.project=[DTP Project Name] # === DTP REPORTING === # Enables reporting test results to DTP server - be sure to configure DTP server settings. #report.dtp.publish=true # Specifies a build identifier used to label results. It may be unique for each build # but may also label more than one test sessions that were executed during a specified build. #build.id=${dtp_project}-yyyy-MM-dd # Specifies a tag which represents an unique identifier for the run, used to distinguish it from similar runs. # It could be constructed as minimal combination of following variables that will make it unique or specified manually. # e.g. ${config_name}-${project_module}-${scontrol_branch}-${exec_env} #session.tag=[tag] # Specifies a set of tags that will be used to create coverage images in DTP server. # Coverage images allow you to track different types of coverage, such as coverage for unit, functional, manual tests and others. # There is a set of predefined tags that will be automatically recognized by DTP, see the examples below. # You can also specify other tags that will be used to create coverage images. #report.coverage.images=${dtp_project} #report.coverage.images=${dtp_project};${dtp_project}_Unit Test #report.coverage.images=${dtp_project};${dtp_project}_Functional Test #report.coverage.images=${dtp_project};${dtp_project}_Manual Test # === CONSOLE VERBOSITY LEVEL === # Increases console verbosity level to high. #console.verbosity.level=high
配置被测应用程序以获取覆盖率
在开始使用 SOAtest 收集覆盖率信息前,您需要通过 Parasoft dotTEST 或 Parasoft Jtest 配置被测应用程序(AUT)。下面的内容概述了这一过程;有关更详细的说明,请参阅 docs.parasoft.com 的 Jtest 或 dotTEST 用户指南。请确保 SOAtest、dotTest 和 JTest 版本同步,以避免出现意外问题。
- (可选)通过配置覆盖率代理选项自定义覆盖率代理。如要收集同时与 AUT 交互的多个用户的覆盖率信息,则需执行此步骤。
- 关联 AUT 和覆盖率代理。
配置覆率盖代理
应用程序服务器通常包含多个应用程序。此外,不需要检测通用服务器类或应用程序库。代理仅需要收集应用程序源代码的覆盖率。对所有类进行检测将非常耗时。因此正确设置覆盖代理的范围非常重要。Jtest 和 dotTEST 均有覆盖率代理。
Jtest 覆盖率代理
您可以通过修改 agent.properties 中的属性并将这些属性传递给 -javaagent
参数来配置 Jtest 覆盖率代理。该代理支持多个参数(请参阅Coverage Agent Parameters),但是配置默认设置适用于大多数情况:
jtest.agent.serverEnabled=true jtest.agent.includes=com/myapp/data,com/myapp/common/** jtest.agent.excludes=com/myapp/transport/*,com/myapp/autogen/**
覆盖率代理参数
下表描述了可以为代理设置的所有属性:
jtest.agent.runtimeData | 指定应用程序在服务器上的位置,代理用于存储它在运行时收集的覆盖数据。 |
---|---|
jtest.agent.includes | 以逗号分隔的模式列表,用于指定要检测的类。支持以下通配符:
在以下示例中,将检测
|
jtest.agent.excludes | 以逗号分隔的模式列表,用于指定要从检测中排除的类。支持以下通配符:
在以下示例中,将检测
|
jtest.agent.autostart | 启用/禁用自动运行时数据收集;默认为 true 。 |
jtest.agent.port | 设置代理通讯端口;默认值为8050 。 |
jtest.agent.debug | 启用/禁用向控制台的详细输出;默认为 false 。 |
jtest.agent.enableMultiuserCoverage | 启用/禁用收集多个用户的 Web 应用程序覆盖率;默认为 |
jtest.agent.serverEnabled | 激活代理。 |
jtest.agent.enableJacoco | 让代理使用 JaCoCo 引擎收集覆盖率信息;默认为 false 。 |
配置属性后,在启动应用程序服务器以附加代理并包含代理配置文件时添加 -javaagent
参数:
-javaagent:'/path/to/agent.jar'=settings='/path/to/agent.properties',runtimeData='/path/to/runtime_coverage'
为方便起见,覆盖率目录包含一个将生成-javaagent
参数的脚本。运行 agent.sh 或 agent.bat 脚本,然后将输出复制到服务器启动脚本中。
$ ./agent.sh 将此 Java VM args 添加到您的进程中: --------------------------------------------------- -javaagent:"/home/TIA/test_impact_analysis/integration/coverage/agent.jar"=settings="/home/TIA/test_impact_analysis/integration/coverage/agent.properties",runtimeData="/home/TIA/test_impact_analysis/integration/coverage/runtime_coverage" --------------------------------------------------- Press any key to continue ...
在以下示例中,该代理通过 catalina.sh(Linux)或 catalina.bat(Windows)脚本开头的 JAVA_OPTS 变量连接到 Tomcat 服务器:
if [ "$1" = "start" -o "$1" = "run" ]; then JAVA_OPTS='-javaagent:"/home/TIA/test_impact_analysis/integration/coverage/agent.jar"=settings="/home/TIA/test_impact_analysis/integration/coverage/agent.properties",runtimeData="/home/TIA/coverage_storage"' fi
if "%1"=="stop" goto skip_instrumentation set JAVA_OPTS=-javaagent:"C:\TIA\test_impact_analysis\integration\coverage\agent.jar"=settings="C:\TIA\test_impact_analysis\integration\coverage\agent.properties",runtimeData="C:\TIA\coverage_storage" :skip_instrumentation
启动应用程序并通过在浏览器中打开 <host>:8050/status
来验证代理已经准备好了。您将看到一个包含 test、runtime_coverage 和 testCase 属性的 JSON 对象,例如:
{"test":null,"session":"runtime_coverage_20191008_1537_0","testCase":null}
您还可以使用 runtimeData 属性检查(在上面的示例中为 /home/TIA/coverage_storage
)指定的目录。该目录应包含一组静态覆盖数据文件。文件在代理启动时生成。
dotTEST 覆盖率代理
dotTEST 覆盖率代理可收集 web 应用程序和独立应用程序的覆盖率。两种应用程序需要进行不同的配置。
Web 应用程序
被测应用程序(AUT)必须在使用 IIS 7.5 或更高版本的机器上运行。
关联覆盖率代理和 AUT:
- 将
<INSTALL_DIR>/coverage/dotNET/dottest_agent
文件夹复制到安装 IIS 和部署 wen 应用程序的机器上。 - 在机器上以管理员身份运行控制台。
在机器上调用代理客户端工具,在 IIS 内启用运行时覆盖率收集:
agent_client.exe
agent_client 初始化 web 服务器(IIS)的环境并像服务一样运行,使您能够执行测试并收集覆盖率。只要输出端打印出以下信息,即表示服务已准备就绪,等待命令:
Write 'exit' and hit Enter to close agent_client
即使尚未加载被测网站或应用程序,也可启动测试会话和测试。
- 确保机器的防火墙设置中的 8050 端口(覆盖率代理的默认端口)允许 HTTP 通讯报文。如果默认端口不可用,可以更改覆盖率代理端口号。
启动应用程序并通过在浏览器中打开
<host>:8050/status
来验证代理已经准备好了。您将收到以下响应:{"session":null,"test":null}
配置 soatest.properties 以手机 AUT 的覆盖率。支持多个应用覆盖率参数(请参阅应用覆盖率设置),但配置以下设置适用于大多数情况:
application.coverage.enabled=true application.coverage.agent.url=http://localhost:8050 application.coverage.binaries=c:/<PATH_TO_APPLICATION_PDB_FILES>/bin application.coverage.binaries.include=<INCLUDE_PATTERN> application.coverage.binaries.exclude=<EXCLUDE_PATTERN>
请确保应用程序二进制文件的路径指向包含应用程序 PDB 文件的文件夹。
独立应用程序
大多数用户会收集 web 应用程序的覆盖率,但也可以收集独立应用程序的覆盖率信息。
- 将
<INSTALL_DIR>/coverage/dotNET/dottest_agent
文件夹复制到您打算用来运行独立应用程序的计算机上。 - 运行文件夹中的 coverage_wizard.exe,指定以下内容:
- 应用程序的完整路径
- 命令行参数
- 工作目录
- 选择应用程序使用的 .NET CLR 版本。
- 在目标脚本目录字段中输入保存向导生成脚本的目录。
- 启用使用覆盖率代理选项,并根据情况启用或禁用无需管理员权限即可收集覆盖率选项。
- 默认情况下,使用覆盖率代理收集覆盖率需要管理员权限,但也可以配置该工具,让没有管理员权限的用户收集覆盖率。这样做会生成两个额外的 .bat 脚本:runCamAgentInit.bat 和 runCamAgentUninit.bat。以管理员权限运行 runCamAgentInit.bat 脚本来设置和初始化覆盖率代理。测试完成后,运行 runCamAgentUninit.bat 脚本停止进程。
- 点击 Finish。向导将在上面指定的目标脚本目录中生成脚本。
- 在机器上以管理员身份运行控制台,并将目录更改为脚本生成的位置。
- 执行 runCamAgent.bat。
- 以管理员身份运行另一个控制台并执行 monitorCoverage.bat。
配置 soatest.properties 以手机 AUT 的覆盖率。支持多个应用覆盖率参数(请参阅应用覆盖率设置),但配置以下设置适用于大多数情况:
application.coverage.enabled=true application.coverage.agent.url=http://localhost:8050 application.coverage.binaries=c:/<PATH_TO_APPLICATION_PDB_FILES>/bin application.coverage.binaries.include=<INCLUDE_PATTERN> application.coverage.binaries.exclude=<EXCLUDE_PATTERN>
请确保应用程序二进制文件的路径指向包含应用程序 PDB 文件的文件夹。
配置 SOAtest 以收集和上传覆盖率
通过正确的配置,SOAtest 将在测试执行期间收集应用程序覆盖率。要收集覆盖率,请在 SOAtest 设置文件(请参阅配置设置)中酌情配置以下选项:
- build.id:设置为与覆盖率结果相关联的构建 ID。如果要将 SOAtest 覆盖率结果与其他类型的测试结果(如同一应用程序的单元测试和手动测试)合并,那么它们必须使用相同的构建 ID。此处设置的构建 ID 必须与收集静态和动态覆盖率文件以及上传覆盖率数据时为 dotTEST 或 Jtest 设置的构建 ID 相匹配。
- dtp.project:该值必须与收集静态和动态覆盖率文件时为 dotTEST 或 Jtest 设置的 dtp.project 值相匹配。
- report.dtp.publish:设置为
true
可将测试结果数据发布到 DTP。 - application.coverage.enabled:设置为
true
。将启用应用覆盖率。 - application.coverage.agent.url:指定托管被测应用程序和覆盖率代理的 URL。包括代理的协议(HTTP/HTTPS)和端口号。用分号(;)分隔多个条目。例如:
http\://<Agent Host>\:8050;http\://<Agent Host>\:9050
。 - application.coverage.user.id:可选项。指定用户 ID,以便将覆盖率结果与特定用户关联。只有当覆盖率代理被配置为以多用户模式运行时,才应该指定用户 ID。请参阅下面的
jtest.agent.enableMultiuserCoverage
。 - application.coverage.dtp.publish:设置为
true
可将覆盖率报告上传至 DTP,设置为false
则不将覆盖率报告上传至 DTP。如果配置了多个覆盖率代理,它们的覆盖率报告将合并为一份 DTP 覆盖率报告。如果-publish
传递给 soatestcli,则默认为report.dtp.publish
(请参阅配置设置)的值或true
。 - application.coverage.binaries:可选项。对于 Jtest,请指定包含被测应用程序(AUT)二进制文件的 URL 或本地文件。您可以指定文件夹或 .war、.jar、.zip 或 .ear 文件的路径。对于 dotTEST,请指定包含应用程序 PDB 文件的文件夹。如果静态覆盖率文件单独上传到 DTP,则不需要。如果指定了
application.coverage.static.file
,则不应使用。 - application.coverage.binaries.exclude:可选项,但建议使用。指定以逗号分隔的应用程序二进制文件形式,以便在 AUT 扫描期间将其排除在外。如果既未配置此项,也未配置
application.coverage.binaries.include
,二进制文件的分析时间会更长,对应用程序的分析也会超出需要。如果指定了application.coverage.static.file
,则不应使用。默认情况下,接受所有二进制文件。例如,application.coverage.binaries.exclude=jakarta/**,java/**,javax/**,org/apache/**,org/springframework/**
- application.coverage.binaries.include:可选项,但建议使用。如果既未配置此项,也未配置
application.coverage.binaries.exclude
,二进制文件的分析时间会更长,对应用程序的分析也会超出需要。指定以逗号分隔的应用程序二进制文件形式,以便在 AUT 扫描期间将其包含在内。如果指定了application.coverage.static.file
,则不应使用。默认情况下,接受所有二进制文件。例如,application.coverage.binaries.include=com/myapp/data/*,com/myapp/common/**
- application.coverage.static.file:可选项。指定使用 .xml 或 .data 格式的 dotTEST 或 Jtest,或分析应用程序二进制文件的 SOAtest 覆盖率工具生成的静态覆盖率文件的路径。如果静态覆盖率文件单独上传到 DTP,则不需要。如果指定了
application.coverage.binaries
,则不应使用。 - application.coverage.images:指定一组标签,用于在 DTP 中创建覆盖率图像。覆盖率图像为唯一标识符,用于汇总具有相同构建 ID 的各个运行的覆盖率数据。用分号(;)分隔多个条目。详情请参阅 Parasoft DTP 用户指南。例如:
${dtp_project};${dtp_project}_Functional Test
。
执行测试以收集和上传覆盖率
使用配置的测试配置和设置文件,在命令行模式下运行测试(请参阅Configuring SOAtest to Collect and Upload Coverage)。此步骤应为自动化过程的一部分。覆盖率数据将在测试执行时收集,如果启用了发布到 DTP 功能,则上传到 DTP。
查看 DTP 中的覆盖率
前往 DTP 并打开覆盖率浏览器,查看 SOAtest 测试实现的应用程序覆盖率。 有关使用覆盖率浏览器的详细信息,请参阅 https://docs.parasoft.com 中的 Parasoft DTP 用户指南。