章节目录:
简介
以下教程将指导您如何使用 Jtest 收集应用程序的覆盖率。该教程包括与基本主题相关的信息,如运行服务器和部署应用程序,因此无论是对新用户还是进阶用户而言都能有所帮助。
前提条件
可以在任何接受 Java 代理的服务器上收集 Web 应用程序覆盖率。完成本教程需满足以下要求:
- Java JDK 1.8
- Apache Maven 构建系统
- calculator 示例,一个非常基本的 Web 应用程序。您可以在
[INSTALL]/examples
目录中找到该示例。 - 下列应用程序服务器之一:
- Apache Tomcat(已使用 6.0、7.0、8.0 版本进行验证)
- JBoss/WildFly
- Oracle WebLogic
步骤 1:准备 calculator 示例
构建 WAR 文件。应用程序必须打包到服务器上的 WAR(Web Application Archive)文件中。使用 Jtest 提供的 maven-war-plugin 对应用程序打包。该插件会自动构建具有正确 WAR 结构的应用程序。在应用程序目录中执行以下命令:
mvn clean install
步骤 2:将示例部署到应用程序服务器
将应用程序部署到应用程序服务器。有关将 calculator 示例部署到不同应用程序服务器的信息,请参阅将示例部署到 Tomcat、将示例部署到 WildFly/JBoss 以及将示例部署到 Oracle WebLogic。
部署到 Tomcat 应用程序服务器
部署应用程序服务器有多种方法,但在本教程中,我们将演示如何使用 Tomcat Manager Web 应用程序进行远程部署。
打开 [Apache Tomcat 安装目录]/conf/tomcat-users.xml 并在
<tomcat-users>
部分添加以下内容:<user username="tomcat" password="tomcat" roles="tomcat, manager-gui"/>
执行以下命令运行服务器:
Windows[Your apache-tomcat installation directory]/bin/startup.bat
Linux
[Your apache-tomcat installation directory]/bin/startup.sh
在浏览器中打开以下 URL,输入步骤 1 中设置的用户名和密码(tomcat/tomcat):
http://localhost:8080/manager/html
- 在 WAR 文件中,点击 Choose File 并找到 Calculator.war 进行部署。
点击 Deploy;该应用程序将通过以下 URL 提供:
http://localhost:8080/calculator
- 与应用程序交互,测试其功能
将示例部署到 WildFly/JBoss 应用程序服务器
有多种方法可以部署 WildFly/JBoss 应用服务器,但我们在本教程中使用 JBoss Web 控制台进行部署演示。这些说明适用于 JBoss AS 7.1.1、JBoss EAP 6.4 以及 WildFly 8.2 和 9.0 服务器。
在 Windows 上运行 add-user 脚本,将新用户添加到服务器:
[JBoss installation directory]/bin/add-user.bat
提示选择用户类型时,选择 Management User:
What type of user do you wish to add? a) Management User (mgmt-users.properties) b) Application User (application-users.properties) (a): a
根据提示输入用户名和密码,保留 Realm 字段为空:
Enter the details of the new user to add. Realm (ManagementRealm) : Username : admin Password : 1adm-adm-adm
执行以下脚本运行服务器:
[JBoss installation directory]/bin/standalone.bat
在浏览器中打开以下 URL,输入步骤 3 中指定的用户名和密码(admin/1adm-adm-adm):
http://localhost:9990/console/App.html#deployments
- 点击 Add(在 JBoss 7.1.1 中为 Add Content)并找到 Calculator.war 文件。
- 点击 Next,然后点击 Save。
在 Deployments 列表中启用 Calculator.war 文件,并在浏览器中打开以下 URL:
http://localhost:8080/Calculator
- 与应用程序交互,测试其功能
将示例部署到 Oracle WebLogic 服务器
有多种方法可以部署 WebLogic 应用程序服务器,但在本教程中,我们将演示如何使用 Admin Console 进行远程部署。该方法已使用 12.2.1 和 10.3.6 版本完成验证。
本教程假设您已经安装了 WebLogic 服务器并创建了服务器域。
- 前往 Administration Console(http://localhost:7001/console)。
- 在 Domain Structure 面板菜单,点击 Deployments 打开 Summary of Deployments 部分。
- 在 Deployments 表中,点击 Install 按钮。
- 在 Arguments 字段指定您的 WAR 文件的路径。
- 点击 Next。
- 选择 Install this deployment as an application 选项。
- 点击 Next。
- 点击 Finish。
- 与应用程序交互,测试其功能(http://localhost:7001/Calculator)
步骤 3:准备元数据文件
在示例应用程序的主目录中执行以下命令:
mvn package jtest:monitor
该目标会生成 monitor.zip 包,其中包含收集应用程序覆盖率所需的工件。
步骤 4:生成 javaagent
VM 参数
将 monitor.zip 包的内容解压到服务器机器中,运行 agent.bat(Windows)或 agent.sh(Linux)脚本。将生成 javaagent 标志,打印到控制台。
您的 javaagent
标志可能类似于:
-javaagent:"E:\Parasoft\JTest\examples\calculator\target\jtest\monitor\monitor\agent.jar"=settings="E:\Parasoft\JTest\examples\calculator\target\jtest\monitor\monitor\agent.properties",runtimeData="E:\Parasoft\JTest\examples\calculator\target\jtest\monitor\monitor\runtime_coverage"
如果已配置 OpenTelemetry Java 代理并添加到项目中,则必须禁用 jtest.agent.autoloadMultiuserLibs
属性。此外还必须配置 Jtest 扩展的路径:
-Dotel.javaagent.extensions=path_to/jtest-otel-ext.jar
步骤 5:从应用程序服务器收集运行时数据
从您的应用程序服务器收集运行时数据:Tomcat、WildFly/JBoss 或 Oracle WebLogic。
从 Apache Tomcat 收集运行时数据
打开脚本文件:Windows
[Your apache-tomcat installation directory]/bin/catalina.bat
Linux
[Your apache-tomcat installation directory]/bin/catalina.sh
将
javaagent
标志放在脚本开头部分。Windows
if "%1"=="stop" goto skip_instrumentation set JAVA_OPTS=%JAVA_OPTS% [generated javaagent flag] :skip_instrumentation
Linux
if [ "$1" = "start" -o "$1" = "run" ]; then export JAVA_OPTS="$JAVA_OPTS [generated javaagent flag]" fi
-javaagent
标志必须放在单独一行(不可拆分)。重新启动服务器并在浏览器中打开以下 URL:
http://localhost:8080/Calculator
- 与应用程序交互,然后停止服务器。
Jtest 代理将根据由 mvn package jtest:monitor
目标生成的 -javaagent
标志中的 runtimeData 属性写入运行时数据。默认情况下,运行时数据写入 [monitor 目录路径]/monitor/runtime_coverage
目录。
从 JBoss 和 WildFly 收集运行时数据
标准的 Java 分层类加载器不适用于 J2EE 服务器,因为所有 JAR 文件无论是否使用都始终会被加载;应用程序无法按需加载 JAR 文件。此外,没有一个合适的解决方案来限制 JAR 文件之间的可见性,这常常会导致同一个库的两个版本发生冲突。这也就导致需要创建包含所有类的大型类加载器。
JBoss 和 WildFly 服务器通过使用 JBoss 模块来克服这些挑战。模块化、非分层类加载的实现也是 JBoss OSGi 和 JBoss Java EE 实现的基础。
然而,这种类加载器的优势在从这些服务器收集运行时数据方面带来了新的问题。Jtest 代理库必须对应用程序类可见,但 JBoss 模块对此存在限制。这便是添加 -javaagent
标志的原因,否则将会返回 ClassNotFoundException
异常。
因此,还需要使用 jboss.modules.system.pkgs
系统属性。与此同时存在的另一个问题是:JBoss 在自己的脚本中设置该标志。由于这些脚本可能会覆盖先前设置的脚本,这种行为会使 JBoss 和 Jtest 代理之间的集成变得复杂。
JBoss AS 7.1/JBoss EAP 6.4/WildFly 8.2/9.0
将
-javaagent
标志添加到启动脚本中。
Windows
a) 打开[您的 jboss 安装目录]/bin/standalone.conf.bat
并为文件末尾的 JAVA_OPTS 添加javaagent
标志:set "JAVA_OPTS=%JAVA_OPTS% [generated javaagent flag]"
- 将 "
:JAVA_OPTS_SET
" 作为文件最后一行。- 将
-javaagent
标志放在单独一行(不可拆分)。- 对于运行在 Java 7 环境下的服务器,将
-XX:-UseSplitVerifier
标志添加到 JAVA_OPTS。
b) 通过更改以下内容,将javaagent
类添加到jboss.modules.system.pkgs
设置:set "JAVA_OPTS=%JAVA_OPTS% -Djboss.modules.system.pkgs=org.jboss.byteman"
更改为
set "JAVA_OPTS=%JAVA_OPTS% -Djboss.modules.system.pkgs=org.jboss.byteman,org.jboss.logmanager,com.parasoft.jtest.instrumentation,shaded_parasoft_jtest.com.parasoft.jtest.runtime -Djava.util.logging.manager=org.jboss.logmanager.LogManager -Xbootclasspath/p:[JBOSS-INSTALL-DIR]/modules/system/layers/base/org/jboss/logmanager/main/jboss-logmanager-2.1.14.Final.jar -Xbootclasspath/p:[JBOSS-INSTALL-DIR]/modules/system/layers/base/org/wildfly/common/main/wildfly-common-1.5.1.Final.jar"
其中
[JBOSS-INSTALL-DIR]
应替换为您当前的 JBoss/WildFly 安装目录。此外,确保以下 jar 文件名称正确:[JBOSS-INSTALL-DIR]/modules/system/layers/base/org/jboss/logmanager/main/jboss-logmanager-2.1.14.Final.jar 和 [JBOSS-INSTALL-DIR]/modules/system/layers/base/org/wildfly/common/main/wildfly-common-1.5.1.Final.jar。以上示例中所示版本仅适用于 WildFly 18.0.1-Final 版本的应用程序服务器。
c) 使用 standalone.bat 脚本重新启动服务器。
Linuxa) 打开
[您的 jboss 安装目录]/bin/standalone.conf
并将javaagent
标志添加到文件末尾的 JAVA_OPTS:set "JAVA_OPTS=$JAVA_OPTS [generated javaagent flag]"
- 将
-javaagent
标志放在单独一行(不可拆分)。- 对于运行在 Java 7 环境下的服务器,将
-XX:-UseSplitVerifier
标志添加到 JAVA_OPTS。b) 通过更改以下内容,将
javaagent
类添加到jboss.modules.system.pkgs
设置:JBOSS_MODULES_SYSTEM_PKGS="org.jboss.byteman"
更改为
其中JBOSS_MODULES_SYSTEM_PKGS="-Djboss.modules.system.pkgs=org.jboss.byteman,org.jboss.logmanager,com.parasoft.jtest.instrumentation,shaded_parasoft_jtest.com.parasoft.jtest.runtime -Djava.util.logging.manager=org.jboss.logmanager.LogManager -Xbootclasspath/p:[JBOSS-INSTALL-DIR]/modules/system/layers/base/org/jboss/logmanager/main/jboss-logmanager-2.1.14.Final.jar -Xbootclasspath/p:[JBOSS-INSTALL-DIR]/modules/system/layers/base/org/wildfly/common/main/wildfly-common-1.5.1.Final.jar"
[JBOSS-INSTALL-DIR]
应替换为您当前的 JBoss/WildFly 安装目录。此外,确保以下 jar 文件名称正确:[JBOSS-INSTALL-DIR]/modules/system/layers/base/org/jboss/logmanager/main/jboss-logmanager-2.1.14.Final.jar 和 [JBOSS-INSTALL-DIR]/modules/system/layers/base/org/wildfly/common/main/wildfly-common-1.5.1.Final.jar。以上示例中所示版本仅适用于 WildFly 18.0.1-Final 版本的应用程序服务器。c) 使用
standalone.sh
脚本重新启动服务器。在 Web 浏览器中打开以下 URL:
http://localhost:8080/Calculator/
- 与应用程序交互,然后停止服务器。
Jtest 代理将在 Jtest 目标 maven 目录(target/jtest)中创建一个 runtimeData.data
文件。该位置会被写入 .json 数据文件,因此无需专门记忆。
JBoss 6.1/5.1
jboss 的旧版本不需要设置 jboss.modules.system.pkgs 属性。
Windows
打开 [您的 jboss 安装目录]/bin/run.conf.bat 并将 javaagent 标志添加到文件末尾的 JAVA_OPTS:
set "JAVA_OPTS=%JAVA_OPTS% [generated javaagent flag]"
- 将 "
:JAVA_OPTS_SET
" 作为文件最后一行。- 将
-javaagent
标志放在单独一行(不可拆分)。- 使用
run.bat
脚本重新启动服务器。
Linux
打开
[您的 jboss 安装目录]/bin/run.conf.bat
并将javaagent
标志添加到文件末尾的 JAVA_OPTS:set "JAVA_OPTS=$JAVA_OPTS [generated javaagent flag]"
- 将
-javaagent
标志放在单独一行(不可拆分)。- 使用
run.sh
脚本重新启动服务器。
从 Oracle WebLogic 收集运行时数据
打开脚本文件:Windows
[Your weblogic installation directory]/user_projects/domains/[your domain]bin/startWebLogic.cmd
Linux
[Your weblogic installation directory]/user_projects/domains/[your domain]bin/startWebLogic.sh
将
-javaagent
标志添加到 JAVA_OPTIONS(在以 START WEBLOGIC 注释开头的部分)。-javaagent
标志必须放在单独一行:
Windows@REM START WEBLOGIC set JAVA_OPTIONS=%JAVA_OPTIONS% [generated javaagent flag]
Linux
# START WEBLOGIC export JAVA_OPTIONS=$JAVA_OPTIONS [generated javaagent flag]
重新启动服务器并在浏览器中打开以下 URL:
http://localhost:7001/Calculator
- 与应用程序交互。
- 停止服务器。
Jtest 代理将根据由 mvn package jtest:monitor
目标生成的 -javaagent
标志中的 runtimeData
属性写入运行时数据。默认情况下,运行时数据写入 [monitor 目录路径]/monitor/runtime_coverage
目录。
步骤 6:生成覆盖率报告
运行 Calculate Application Coverage 测试配置,并使用专用的 -static
和 -runtime
参数传递 static_coverage.xml 文件和运行时覆盖率数据的目录:
java -jar jtestcov.jar -static [path to static_coverage.xml file] -runtime [path/dir]
static_coverage.xml 文件的路径必须指向从包含此文件的 monitor.zip 包中提取的内容。
runtime_coverage 目录的路径会作为 -javaagent
VM 参数中的 runtimeData
属性输出到控制台。