jmeter 读取.jmx并解析

本文介绍了jmeter如何读取并解析.jmx测试计划文件。当打开.jmx文件时,jmeter使用Xstream进行解析,加载组件如控制器、beanshell和HTTP请求等,并依据saveservice.properties配置文件进行映射。解析过程中涉及的动作包括文件选择、检查脏状态、读取文件、注入脚本路径、使用SaveService加载HashTree,以及通过Xstream的转换器进行组件实例化。
摘要由CSDN通过智能技术生成

摘要
1.jmeter的所有测试计划数据,都会保存在.jmx中
2.当你打开一个.jmx后,jmeter会使用Xstream 进行解析,并加载相应的组件,比如:控制器,beanshell,http请求框 。以及加载相应的GUI。
3.所有的组件,位置和对应class都保存在: /bin/saveservice.properties 中

过程解析:

当你从GUI点击add,然后选取你需要的.jmx读入,并进行操作时的一些小流程:

  1. 首先,启用了open方法:
    o.a.j.g.a.ActionRouter: in gui.action.performAction,actionCommand=open
    o.a.j.g.a.Load: doActionAfterCheck方法,
    (JFileChooser选择.jmx文件)

该动作,会调用
o.a.j.g.a.ActionRouter: in gui.action.performAction,actionCommand=check_dirty

检查你现在是否有打开的jmx,以及已经打开的jmx,有没有未保存项等。
如果未保存就会弹出框框,问你是否需要保存XXXX之类操作】
if (!merging) { // i.e. it is OPEN
if (!Close.performAction(e)) {
return;
}
}
接着,
o.a.j.g.a.ActionRouter: in gui.action.performAction,actionCommand=stop_thread

最后才到真正的读取文件
o.a.j.g.a.Load: Loading file:: F:\Worker\Jmeter\XXX.jmx
loadProjectFile(e, selectedFile, merging){
loadProjectFile(e, f, merging, true);
}
loadProjectFile会到FileServer 文件中,将jmx的脚本路径注入,并核查文件是否打开
o.a.j.s.FileServer: Set new base=‘F:\EB-Worker\Jmeter’

if (setDetails) {
FileServer.getFileServer().setBaseForScript(f);
}

最后,到SaveService类中,读取hashTree
log.info(“now load hashtree”);
final HashTree tree = SaveService.loadTree(f);

额,这个SaveService首先会初始化一些内容:
INFO o.a.j.s.SaveService: Testplan (JMX) version: 2.2. Testlog (JTL) version: 2.2
INFO o.a.j.s.SaveService: Using SaveService properties file encoding UTF-8
INFO o.a.j.s.SaveService: Using SaveService properties version 5.0

这些配置在:bin目录下的saveservice.propertes配置中。初始化时,加入配置

接着loadTree:
try (InputStream inputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream =
new BufferedInputStream(inputStream)){
return readTree(bufferedInputStream, file);
}

然后通过Xstream工具的 fromXML进行解析。注:wrapper里面封装了HashTree。
整体存储jmx的结构的是HashTree。

private static final XStream JMXSAVER = new XStreamWrapper(new PureJavaReflectionProvider());

wrapper = (ScriptWrapper) JMXSAVER.fromXML(inputStreamReader);

然后显示到屏幕上,jTree工具
final boolean isTestPlan = insertLoadedTree(e.getID(), tree, merging);

这里需要保证,该hashtree是testplan

这里说一下,xstream的解析,是通过,转接器来进行的:

在这里插入图片描述

在这里插入图片描述

起点是scriptWrapperConverter。绝大多数都是 TestElementConverter 解析,因为多数组件都是继承于 TestElemen
在这里插入图片描述
scriptwrapper:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

获取nodename后,以nodeName为准,根据saveservice.properties中的记录,进行映射后,获取相应的class,然后将相关数据注入

对了。转换器也是在 saveservice.properties 中记录,然后注入到xstream中:

_org.apache.jmeter.save.converters.SampleEventConverter=
_org.apache.jmeter.save.converters.SampleResultConverter=collection
_org.apache.jmeter.save.converters.SampleSaveConfigurationConverter=collection
_org.apache.jmeter.save.converters.StringPropertyConverter=
_org.apache.jmeter.save.converters.HashTreeConverter=collection
_org.apache.jmeter.save.converters.TestElementConverter=collection
_org.apache.jmeter.save.converters.TestElementPropertyConverter=collection
_org.apache.jmeter.save.converters.TestResultWrapperConverter=collection

/**
 * Load a Test tree (JMX file)
 * @param file the JMX file
 * @return the loaded tree
 * @throws IOException if there is a problem reading the file or processing it
 */
public static HashTree loadTree(File file) throws IOException {
    log.info("loadtree Loading file: {}", file);
    try (InputStream inputStream = new FileInputStream(file);
            BufferedInputStream bufferedInputStream = 
                new BufferedInputStream(inputStream)){
        return readTree(bufferedInputStream, file);
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值