摘要
1.jmeter的所有测试计划数据,都会保存在.jmx中
2.当你打开一个.jmx后,jmeter会使用Xstream 进行解析,并加载相应的组件,比如:控制器,beanshell,http请求框 。以及加载相应的GUI。
3.所有的组件,位置和对应class都保存在: /bin/saveservice.properties 中
过程解析:
当你从GUI点击add,然后选取你需要的.jmx读入,并进行操作时的一些小流程:
- 首先,启用了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);
}
}