Try to Test WLS application with JMeter
JMeter的各组件以及如何扩展已完成,现在要利用JMeter对Weblogic Server 的一些应用/组件的性能测试。简单说就是利用JUnit 驱动,在单元测试中驱动JMeter,集成WLS完成一些底层的并发测试,最简单的一个场景:比如在某个单元测试性能评测中,我要测试 n 个并发,其中2%做写操作,98%做读操作。最终的结果都会在Hudson上汇总,看到JUnit Report和JMeter Report,不仅能反映出每个单元测试的功能是否正确,还能反映出并发性能。
WLS 有两种 Unit 测试,一种是Remote,一种是Local。Remote和Local是相对与WLS JVM来说的,这里有两类JVM,一是JUnit 运行的JVM,另一种是运行Weblogic Server的JVM,运行在JUnit JVM的测试就是Remote,运行在WLS JVM上的就是Local。RemoteTest一般需要通过获得EJB Remote接口,通过RMI/serialization去调用执行;LocalTest需要把Junit test发送到WLS JVM再执行,相应的一些字节码 / 类库如果WLS集群上没有也需要一起发送过去,这种测试需要取得WLS Security上下文。本文着重与JMeter集成的介绍,对于其他部分会略过。
有了前几篇对JMeter分析的铺垫,JMeter扩展部分很好设计:我需要一个特定的Engine以便线程之间Classloader切换;需要一个ThreadGroup来管理线程以便统一使用WLS Workmanager对线程池的管理;需要扩展JMeterThread以便对线程在生命周期内做额外的清理工作;需要扩展自己的Sampler便于集成客户端的测试逻辑代码;需要扩展自己的ResultCollector便于做LocalTest的时候将result从WLS JVM发回到JUnit JVM。另外,我需要一个工具类来构建一个测试所需要的HashTree,提供给JMeterEngine; 我可能需要一个Driver来驱动JMeterEngine开始测试。所以这边的类图大概应该是这样的(仅仅是Demo示例,实际可能会更复杂)。
JMeter集成已设计好,接下来设计客户端部分API。首先一个IWlsTest作为测试单元接口;TestTask为最基本的测试任务,具体测试逻辑留给客户端实现;WlsTest作为一个Unit Test会包含一组TestTask;需要一个WlsPerfTest来封装WlsTest,再需要一个TestHarness,用来提供API给客户端调用,并把客户端定义的参数WlsTest封装成WlsPerfTest驱动执行。另外,根据不同的测试,我需要一个RemotePerfTest,一个LocalPerfTest。所以这边的类图大概应该是这样的(仅仅是Demo示例):
同样,这个也仅仅是Demo性质的设计,实际我们可能更复杂,可能还需要有独立的StopCondition,TaskSelector等等,我们可能还需要支持集群将一组并发测试分配到每个node上运行,需要收集额外的JVM数据,比如类似于JFR数据等等。
当然,这并不完整,我们还需要定制一个JavaSamplerClient用来封装测试框架的逻辑;最最重要的是针对LocalPerfTest,我们需要一个WEBLOGIC Server Tes tDriver用来接收从Junit JVM发送过来的WlsTest(包括依赖的一些字节码),并在WLS Local 运行。类似下图: