Page tree

Skip to end of metadata
Go to start of metadata

测试影响分析 (TIA) 功能分析被测应用程序的覆盖率数据并输出覆盖率报告,该报告确定哪些测试覆盖了应用程序中的哪些代码。您可以使用 Maven 的 Selenic 插件处理覆盖率报告,并运行受应用程序更改影响的 Selenium 测试子集。本章节:

概述

测试影响分析旨在作为自动化过程的一部分实施。以下概述描述了测试影响分析过程: 

  1. 配置:配置 Selenic 附带的覆盖率代理 (agent.jar) 并将其附加到您的 AUT。将适用于 Maven 的 Selenic 插件集成到您的项目中。  
  2. 收集有关测试用例覆盖的信息:运行您的 Selenium 测试,以便代理可以收集有关测试及其覆盖的代码的数据。
  3. 生成基线覆盖率报告: 运行 TestImpactAnalysis 脚本以处理代理收集的数据以创建基线覆盖率报告。  
  4. 运行受变更影响的测试:当应用程序的新版本可用时,将其部署到服务器并使用适用于 Maven 的 Selenic 插件运行 Selenium 测试。在执行期间指定基线覆盖率文件,只有受变更影响的测试才会运行。 

Java 支持

Java 11 及更高版本支持 TIA。有关更多信息,请参阅 系统需求

配置

执行以下步骤以启用 TIA。

部署您的应用程序

部署您的被测应用程序。支持以任何基于 zip 的文件格式(包括 zip、war、jar 和 ear)打包的应用程序,以及包含独立类文件或嵌入基于 zip 的文件中的类文件的分层目录结构。  

为 Maven 配置 Selenic 插件

将插件添加到您的项目 pom.xml 文件中。以下示例显示了如何为 Selenic 版本 2020.1 添加依赖项,但您应该在构建文件中使用当前版本。

<build>
	<plugins>
		<plugin>
			<groupId>com.parasoft.selenic</groupId>
			<artifactId>selenic-maven-plugin</artifactId>
			<version>2020.1.0-SNAPSHOT</version>
		</plugin>
	</plugins>
</build>

selenic-maven-plugin 配置文件和版本控制系统添加到 Maven 设置文件。可以全局或本地配置这些设置。默认情况下,全局 settings.xml 文件位于 <MAVEN_INSTALL>/conf/ 目录中。本地 settings.xml 文件位于 <USER_HOME>/.m2 目录中。如果本地文件不存在,请将 settings.xml 文件从全局目录复制到本地目录,并将以下 <profiles>元素添加到 <settings> 元素中:

<profiles>
	<profile>
		<id>selenic-maven-plugin</id>
		<activation>
			  <activeByDefault>true</activeByDefault>
		</activation>
		<pluginRepositories>
			<pluginRepository>
				 <id>selenic-local</id>
				 <url>file:/path/to/selenic/test_impact_analysis/integration/maven</url>
			</pluginRepository>
		</pluginRepositories>
	</profile>
</profiles>

配置 TIA_OPTS 环境变量

用于 Maven 的 Selenic 插件包含一个环境变量,用于在执行测试影响分析确定的测试时将参数传递给 Java VM(请参阅执行受变更影响的测试)。将 TIA_OPTS 变量添加到运行 Maven 的机器并指定您想要包含的任何 JVM 参数。例如,您可以将 TIA 运行时的可用内存增加到 2GB:

TIA_OPTS=-Xmx2g 

指定覆盖率报告版本

您可以通过在 TIA_OPTS  环境变量中传递 report.coverage.version 参数来指定要使用的覆盖率报告格式的版本:

TIA_OPTS=-Dreport.coverage.version=<VERSION>

您可以为旧版覆盖率报告指定 1,或为优化报告指定 2

默认值为 2。 

将覆盖率代理连接到 AUT

Selenic 包含一个 Java 代理,它生成确定哪些测试受变更影响所需的覆盖率信息。
该代理在 <INSTALL>/test_impact_analysis/integration/coverage 目录中提供。它从同一目录中的 agent.properties 文件中获取配置设置。您应该将包含 agent.jar 和 agent.properties 文件的覆盖率目录复制到运行 AUT 的机器上。

配置覆盖率代理

应用程序服务器通常包含多个应用程序。此外,不需要检测公共服务器类或应用程序库。代理只需要收集应用程序源代码的覆盖率。检测所有类将太耗时。因此,正确设置覆盖率代理的范围非常重要。

您可以通过修改 agent.properties 中的属性并将这些属性传递给 -javaagent 参数来配置覆盖代理。代理支持多个参数(请参阅覆盖率代理参数),但配置以下设置适用于大多数情况:

jtest.agent.serverEnabled=true
jtest.agent.includes=com/myapp/data,com/myapp/common/**
jtest.agent.excludes=com/myapp/transport/,com/myapp/autogen/*
jtest.agent.associateTestsWithCoverage=true
jtest.agent.collectTestCoverage=true
jtest.agent.autostart=false

启用多会话模式

如果多个用户或测试进程在测试运行时访问应用程序,您可以启用多会话模式。这样代码由自动化测试执行,而其他用户或测试过程执行的代码是可区分的。在多会话模式下,用户 ID 与与不同用户或进程关联的覆盖数据相关联。用户 ID 在执行期间使用 coverageAgentUserID 参数指定(有关详细信息,请参阅 coverageAgentUserID )。

将以下选项添加到 agent.properties 文件以启用多会话模式:

jtest.agent.enableMultiuserCoverage=true

有关更多信息,请参阅在多会话模式下收集测试和覆盖率数据

覆盖率代理参数

下表描述了可以为代理设置的所有属性:

jtest.agent.associateTestsWithCoverage

启用/禁用将覆盖率与特定测试相关联;默认值为 false

jtest.agent.runtimeData

指定应用程序服务器上的位置,以便代理存储它在运行时收集的覆盖率数据。 

jtest.agent.includes

以逗号分隔的模式列表,指定要检测的类。支持以下通配符:

* 匹配零个或多个字符

** 匹配多个目录级别
在以下示例中,将检测 com.myapp.data 包中的所有类以及以 com.myapp.common 开头的包和子包中的所有类:
com/myapp/data/*,com /myapp/common/**

jtest.agent.excludes

以逗号分隔的模式列表,指定要从检测中排除的类。支持以下通配符:

* 匹配零个或多个字符

** 匹配多个目录级别
在以下示例中,com.myapp.transport 包中的所有类以及以 com.myapp.autogen 开头的包和子包中的所有类都将从检测中排除:
com/myapp/transport/*,com/myapp/autogen/**

jtest.agent.autostart

启用/禁用自动运行时数据收集;默认为 true

jtest.agent.port 

设置代理通信端口;默认值为 8050 

jtest.agent.debug 

启用/禁用到控制台的详细输出; 默认为 false 

jtest.agent.collectTestCoverage 

启用/禁用收集测试用例的覆盖率信息。默认值为 false

jtest.agent.enableMultiuserCoverage 

启用/禁用为多个用户收集 Web 应用程序覆盖率;默认值为 false。 

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 参数添加到您的进程中:
---------------------------------------------------
-javaagent:"/home/selenic/test_impact_analysis/integration/coverage/agent.jar"=settings="/home/selenic/test_impact_analysis/integration/coverage/agent.properties",runtimeData="/home/selenic/test_impact_analysis/integration/coverage/runtime_coverage"
---------------------------------------------------
按任意键继续 。。。  

在以下示例中,代理连接到 Tomcat 服务器,并在 catalina.sh (Linux) 或 catalina.bat (Windows) 脚本的开头使用 JAVA_OPTS 变量:

Linux 和 macOS
if [ "$1" = "start" -o "$1" = "run" ]; then 
JAVA_OPTS='-javaagent:"/home/selenic/test_impact_analysis/integration/coverage/agent.jar"=settings="/home/selenic/test_impact_analysis/integration/coverage/agent.properties",runtimeData="/home/selenic/coverage_storage"' 
fi
Windows
if "%1"=="stop" goto skip_instrumentation 
set JAVA_OPTS=-javaagent:"C:\selenic\test_impact_analysis\integration\coverage\agent.jar"=settings="C:\selenic\test_impact_analysis\integration\coverage\agent.properties",runtimeData="C:\selenic\coverage_storage" 
:skip_instrumentation

验证代理是否已配置

启动应用程序并通过在浏览器中打开<host>:8050/status 来验证代理是否已准备就绪。您应该会看到一个 JSON 对象,其中包含测试、会话和 testCase 属性,例如:

{"test":null,"session":"runtime_coverage_20191008_1537_0","testCase":null}

您还可以检查您使用 runtimeData 属性指定的目录(上例中的 /home/TIA/coverage_storage)。该目录应包含一组覆盖率数据文件。这些文件是在代理启动时生成的。

收集测试和覆盖率数据

使用 Selenic 代理运行您的 Selenium 测试。Selenic 代理应配置为收集覆盖率并连接到运行 AUT 和覆盖率代理的主机和端口。您还应该指定用于从服务器下载覆盖率信息的本地目录:

mvn test -DargLine=-javaagent:/path/to/selenic_agent.jar=collectCoverage=true,coverageAgentHost=<host_name>,coverageAgentPort=<port_number>,coverageDir=path/to/save

您还可以将代理配置为在测试执行后保存覆盖率数据。下表描述了与测试影响分析使用相关的所有参数:

collectCoverage 使代理能够收集覆盖率。 
coverageAgentHost 

指定运行 AUT(.war 文件)和覆盖率代理的主机。

默认为 localhost

coverageAgentPort 

指定覆盖率代理的端口。

默认值为8050

coverageAgentUserID

指定用户标识,以便在多会话模式下收集覆盖率时可以区分不同的用户。

coverageDir  

指定要从服务器下载的覆盖率数据的本地目录。 

deleteCoverageFromServer 

从服务器中删除覆盖率数据。

默认为 true

有关 Selenic 代理命令行参数的更多信息,请参阅命令行章节。   

在多会话模式下收集测试和覆盖率数据

如果多个用户或测试进程在 Selenium 测试执行期间同时访问应用程序,则启用多会话模式。多会话模式使您能够识别来自正在执行的 Selenium 测试的内容。执行以下操作以在多会话模式下运行:

  • 在 agent.properties 文件中启用多会话模式(请参阅 启用多会话模式)。
  • 在运行代理之前启动 SOAtest Web 代理服务器以收集完整测试运行期间的覆盖率。SOAtest Web 代理服务器作为 Parasoft Recorder 安装的一部分进行部署。有关更多信息,请参阅安装 Parasoft Recorder
  • 在执行期间使用 coverageAgentUserID 参数指定用户 ID。示例:
mvn test -DargLine=-javaagent:/path/to/selenic_agent.jar=collectCoverage=true,coverageAgentHost=<host_name>,coverageAgentPort=<port_number>,coverageAgentUserID=<userID>,proxyPort=40090,coverageDir=path/to/save"

生成基线覆盖率

Selenic 包含一个用于创建基线覆盖率报告的脚本。该脚本分析 Selenium 测试运行收集的覆盖率数据和 AUT 生成报告的 WAR 文件。根据您的操作系统,您可以运行位于 <INSTALL>/test_impact_analysis 目录中的 TestImpactAnalysis.bat (Windows) 或 TestImpactAnalysis.sh (Linux/macOS) 脚本 。  

Linux/MacOS 的 TEMP 目录

如果尚未设置变量,您可能需要修改 .sh 脚本并指定一个临时目录,例如:

#!/bin/bash 
TMP=/tmp


测试运行完成后,使用以下语法运行 TestImpactAnalysis.sh 或 TestImpactAnalysis.bat 脚本以生成覆盖率报告。

./TestImpactAnalysis.sh -app <PATH TO AUT WAR FILE> -runtimeCoverage <PATH_TO_RUNTIME_COVERAGE> -outputReport <PATH_TO_OUTPUT_REPORT_DIR> -include <SPACE_SEPARATED_PATTERNS> -exclude <SPACE_SEPARATED_PATTERNS>
  • -app 标志指定可部署的 .war。您应该为自动化测试运行指定与 AUT 部署的相同工件(请参阅打包您的应用程序)。
  • -runtimeCoverage 标志指定在执行测试时使用您在 -javaagent参数中配置的 coverageDir参数指定的目录(请参阅收集测试和覆盖率数据)。
  • -outputReport标志是可选的,用于指定输出覆盖率报告的位置。
  • -include 标志是可选的,它指定要包含在分析中的以空格分隔的模式列表。默认情况下,包含所有测试类。  
  • -exclude 标志是可选的,它指定要在分析中排除的以空格分隔的模式列表。与使用 -include 标志指定的模式匹配的类会覆盖排除的模式。
  • 如果要保留用于生成基线覆盖率 XML 报告的运行时覆盖率数据文件,请添加-keepRuntimeCoverage 选项。此参数不带值。如果它不包含在命令中,运行时覆盖率数据文件将在执行结束时被删除。  

示例命令:

Windows
TestImpactAnalysis.bat ^
-app C:\tomcat\webapps\application.war ^
-runtimeCoverage C:\selenic\runtime_coverage ^
-outputReport C:\selenic\reports ^
-include com\myapp\data\**,com\myapp\common\** ^
-exclude com\myapp\transport\**,com\myapp\autogen\** 
Linux 和 macOS
./TestImpactAnalysis.sh \
-app /home/tomcat/webapps/application.war \
-runtimeCoverage /home/selenic/runtime_coverage \
-outputReport /home/selenic/reports \
-include com/myapp/data/**,com/myapp/common/** \
-exclude com/myapp/transport/**,com/myapp/autogen/** 

脚本完成后,coverage.xml 报告将保存到-outputReport 标志指定的位置。如果不包含该标志,则该文件将默认保存到 <USER_HOME>/parasoft/test_impact_analysis/reports/ 目录。

执行受变更影响的测试

当应用程序的新版本可用时,您可以使用适用于 Maven 的 Selenic 插件执行测试,并指定覆盖率文件、部署的 WAR 文件和 Selenic 主目录的路径以仅执行 TIA 报告的测试:

mvn selenic:affected-tests test -Dapp=/path/to/new/parabank.war -DcoverageReport=/path/to/coverage.xml -DselenicHome=/path/to/selenic

您使用 TIA_OPTS 配置的任何 JVM 参数也将被使用(请参阅配置 TIA_OPT 环境变量)。

测试影响分析视频教程

  • No labels