本主题解释如何为任何 Java 应用程序配置监视。当一个适当配置的事件监控工具被放置在测试套件的开始部分(其中包括调用 Java 应用程序的测试(直接或间接地))时,它将接收并可视化所发生的 Java 事件。

本章包含:

需要安装 Parasoft Jtest

通过与 Parasoft Jtest 集成,SOAtest 提供了 Java 运行时错误检测和 Java 事件监视功能,从而为 Java 提供了广泛的测试和分析实践。

在使用 SOAtest 的运行时错误检测和/或 Java 事件监视功能之前,请确保在你的机器上安装了 Jtest,并且启用了 Jtest 连接许可证选项。请查阅 许可证

请联系 Parasoft 代表以访问 Jtest。这种跨产品功能要求 Jtest 和 SOAtest 使用其中一项以下方式进行安装:

  • 将 Jtest 和 SOAtest 插件安装到同一个 Eclipse 实例中,或者
  • Jtest 和 SOAtest 通过 p2 updatesite 归档文件安装(关于详情,请查阅 Eclipse p2 更新站点安装 )。

为什么监视 Java 应用程序?

通过监视仪表化的 Java 应用程序,你可以在执行功能测试时获得对应用程序内部行为的可见性。这允许你更好地确定测试失败的原因,并在回归测试中丰富用例验证标准。除了验证系统返回的消息和通过 ESB 监视的中间消息/步骤之外,还可以验证正在调用的 Java 应用程序中的事件。例如,你可以验证 EJB 方法调用或对另一个系统的远程调用是否使用了预期的参数。

应用程序配置

若要配置用于监视的应用程序,那么需要使用 Parasoft 的监视代理对其进行测试。为此:

  1. 将 insure.jar insureimpl.jar[Jtest_install_dir]/plugins/com.parasoft.xtest.jtest_[version]/resources/ 复制到服务器上的一个目录,其中包含你希望测试的应用程序。
  2. 如果服务器正在运行,请停止它。
  3. 在启动脚本中,将 -javaagent command 添加到现有 Java 参数。有关更多详情,请查阅 javaagent Command Details
  4. 重启服务。

服务器将像往常一样启动,但是使用指定的包类进行检测。现在,每当创建对象实例或调用指定包前缀中的方法时,SOAtest(可以从另一个开发人员/QA 桌面机器上运行)将能够在事件监视器中接收事件通知。

Javaagent 命令详情

基本命令

在所有情况下都需要以下 invocation-time 参数:

指定应使用哪个端口与被监视程序通信。使用 5050 到 5099。

参数说明
soatest要求配置监视。
port=[port_number]指定应使用哪个端口与被监视程序通信。使用 5050 到 5099。
instrument=
[class_name.method_name(jni _sig)]

指定要检查的完全限定方法的前缀。例如,给定的 com.abc.util.IOUtil.method,它将执行 IOUtil.java 类中的所有方法,该类需以 method开头。如果给定的 com.abc.,那么它还将执行那些方法和类的所有方法,其完全限定名以
com.abc.开头。你可以提供特定的类名,或者使用通配符来监视指定包中的任何类。

有关更多详情,请查阅下面的注意事项。

trace=[class_name.method_na me(jni_sig)]指定要跟踪的方法调用的筛选器。有关更多详情,请查阅下面的注意事项。

注意事项 - 执行和跟踪

类的仪表装置应用于类的所有方法体;它提供了可见性,例如,调用类的什么方法以及这些方法返回什么值。

跟踪还通过检测希望可见的代码的调用者来实现。被调用的代码没有被仪表化。

例如,假设你希望跟踪代码中调用的第三方方法,而不是从其他第三方代码中调用的第三方方法。在本例中,你将编写自己的代码,并跟踪对第三方代码的调用。

更具体地说....

instrument=com.acme.util 配置匹配 com.acme.util所有类的仪表装置。这些类的所有方法都是仪表化了的。在下面的代码中, writeData 方法将被仪表化:

package com.acme.util; 
class IOUtil {
       int writeData(DataOutputStream dos, Data data) {
           dos.write(data._int); 
           dos.write(data._float);
       }
}

instrument=com.acme.util,trace=java.io 提供可见的 java.io 调用,该调用由 com.acme.util code发起。仪表装置将调用添加到 writeData() 方法,以便检查哪些由被监视的代码生成的调用调用了 java.io

以下参数是可选的:

参数说明
trace_to_xml

告诉监视器将复杂的 Java 对象序列化为 XML 表示形式。如果省略此选项,则只返回基元和对象的“toString()”值。

强烈建议将此参数用于事件监视器。如果只执行运行时错误检测,则不适用。

xmlsizelimit=[integer_value]确定以字节为单位的最大 XML 大小限制。如果未指定此选项,则默认大小为 100000。
仅当使用 trace_to_xml 时才适用。
xmlcolsizelimit=[integer_value]

在生成 Java 对象的 XML 表示形式时,确定集合、映射、数组显示的元素的最大数量。默认情况下显示前 100 个元素。

仅当使用 trace_to_xml 时才适用。

xmldeeplimit=[integer_value]

在生成 Java 对象的 XML 表示形式时,确定数据结构包含的最大字段深度。默认情况下包含深度为 8 的字段。

仅当使用 trace_to_xml 时才适用。

xmlexcl=[classes_or_fields]

':' 从 xml 序列化中排除的分离类或字段(例如, xmlexcl=com.acme.A:com.acme.B._field)。
仅当使用 trace_to_xml 时才适用。

xmlinc=[classes_or_fields]

':' 在 xml 序列化中始终包含分离的类或字段 (例如,xmlinc=com.acme.A:com.acme.B._field)

xmlinc 的匹配优先于 xmlexcl 的匹配:如果有匹配 xmlinc 的内容,它总是会显示出来(即使 xmlexcl 也匹配它)。

当模式与类名匹配时,1) 该类类型或派生类型的字段将被排除在序列化之外,2) 该类型或派生类型的方法参数和返回值将不会序列化为 xml。

默认情况下,监视器不包括以下类型的类:

..........................

仅当使用 trace_to_xml 时才适用。

xmlsecondslimit=[seconds]

默认情况下,如果你使用 trace_to_xml,那么监视将只花费 10 秒的时间将被监视的复杂 Java 对象转换为 XML 表示。这是为了防止监视代理在监视非常大的对象时出现显著的慢速。如果达到这个限制,那么 SOAtest 事件将显示以下消息,而不是对象的 XML 表示:

跳过:转换成 XML 需要很长时间:10 秒

如果希望更改 10 秒阈值,请使用 xmlsecondslimit 标志。例如:

xmlsecondslimit=20

对于大型对象,推荐的方法是首先避免达到阈值:通过排除不感兴趣的字段来减小 XML 大小(使用 xmlecl 选项)。

trace_exceptions[=exception_c lass_prefix]

显示与创建、抛出或捕获的异常相关的事件的跟踪。

_details 可以添加以获得事件的更多细节(即事件发生的堆栈跟踪)。

terse将简洁的输出配置到控制台(堆栈跟踪只有 1 个元素)。

用于从 Eclipse 或应用程序服务器运行的应用程序

定义自己的类加载器(如 Eclipse、JBoss 和 Tomcat)的应用程序需要将 insure.jar 添加到引导类路径中。若要监视这些应用程序,请添加启动 VM 参数:

-javaagent:"<path_to_jar>\insure.jar=soatest,port=<port>",trace_to_xml,instrument=<my.pack-age.prefix>,trace=<my.package.prefix> -Xbootclasspath/a<path_to_jar>\insure.jar

例如,你可以使用:

-javaagent:"/home/user/parasoft/insure.jar=soatest,port=5060",trace_to_xml,instru-
ment=com.mycompany.onlinestore,trace=com.mycompany.onlinestore -Xbootclasspath/a:/home/user/parasoft/insure.jar

关于其他(独立版)Java 应用程序

至于其他(独立版)Java 应用程序,你不需要将 insure.jar 添加到引导类路径。例如,你可以使用:

java -javaagent:"C:\Program Files\Parasoft\insure.jar=soatest,port=5050",trace_to_xml,instru-ment=com.mycompany.myapp,trace=com.mycompany.myapp

SOAtest 配置

  1. 双击 Event Monitor 工具打开工具配置面板。
  2. Event Source 选项卡中选择 Instrumented Java Application 作为平台,然后指定服务器所在的主机名以及 Parasoft 代理运行时的端口号(默认为 5050)。

提示

  • 当你的应用程序第一次使用监视代理启动时,我们建议你在开始检查所报告的事件之前,先对所需的测试或场景进行一次初始运行。这确保了各种检测和初始化过程的发生。它还可以帮助你获得更真实的数据。第一次运行的执行时间可能明显高于后续运行,可能会导致超时或其他副作用。后续运行将更好地反映被监视系统的真实行为。
  • 从远程代理异步接收事件;接收到的事件与触发这些事件的测试操作之间没有直接的关联。由于 SOAtest 事件监控器按时间顺序显示它接收到的所有事件,因此测试事件和 Java 监视事件有时可能会显示顺序错误。为了降低这种风险,你可以 在每次测试完成执行设置后 增加事件轮询延迟的值。但是,这将导致测试执行时间增加(因为事件监视器将在每次调用之后暂停测试执行)。确保 Maximum monitor execution duration 值对于整个测试套件执行时间来说是足够的。对于这些参数,不同的系统和环境可能有不同的理想阈值,因此常常需要根据具体情况对它们进行调优。
  • 一个最佳实践是开始检测和跟踪更广泛的包集合和类集合,然后逐渐减少这个集合。更多的检测会导致应用程序执行速度变慢,更多的包和类被跟踪会导致返回太多的事件。你可以调整这两个参数,并对它们进行调优,以获得你感兴趣的事件的确切类型。
  • 当使用 trace_to_xml 选项时,你可能会在事件监视器中得到表示对象的非常大型的 XML 内容。其可能以 Mb 为单位,有时会达到 100,000 字节的大小限制(xmlsizelimit可调)。在这些情况下,可以考虑使用上面的各种 xml* 参数来控制感兴趣的内容,并限制数据量。
  • No labels