一种Jmeter工具的脚本运行实现方法与流程

文档序号:26003404发布日期:2021-07-23 21:21阅读:240来源:国知局
一种Jmeter工具的脚本运行实现方法与流程

本技术运用于软件测试领域,实现jmeter工具脚本单个节点运行的简单操作,解决jmeter工具脚本单独运行调试需多步骤繁琐操作的问题。



背景技术:

jmeter是免费开源接口和压测工具,广泛运用于接口测试和性能测试领域,其运行方式是点击“启动”按钮后运行,并获得执行结果。在编写调试脚本过程中,为节省调试时间和方便查看结果树内容,一般是对单个http请求调试,确保该http请求无问题后,再调试下一个http请求。以图1为例,jmeter自带功能需操作如下:如果想单独调试节点“01-01”,则必须先选中“01-02”、“01-03”、“01-04”、“01-04”、“01-05”、“02”、“03”、“04”、“05”节点,鼠标右键,弹出菜单栏后点击“禁用”,然后点击“启动”按钮,才能实现节点“01-01”的单独运行调试。如果想继续调试节点“01-02”,则必须选中节点“01-01”,右键点击“禁用”,再选中节点“01-02”,右键点击“启用”,再点击“启动”按钮,才能实现节点“01-02”的单独调试。

针对上述情况,在整个项目自动化测试脚本编写调试过程中,需要频繁的“禁用”和“启用”,操作极其麻烦。本方案基于jmeter工具源码,开发了单个节点运行按钮,只需选中待调试的节点,右键点击“单个运行”,即可完成待调试的节点的单独调试,解决了jmeter工具自带功能的繁琐操作,提高了脚本调试效率。以图1为例,如果想单独调试节点“01-01”,则选中“01-01”,右键点击“单个运行”即可;如果想单独调试节点“01-02”则选中“01-02”,右键点击“单个运行”即可。



技术实现要素:

本方案主要解决问题是基于jmeter工具源码,开发了单个节点运行按钮,只需选中待调试的节点,右键点击“单个运行”,即可完成待调试的节点的单独调试,解决了jmeter工具自带功能繁琐的操作,提高了脚本调试效率。

一种jmeter工具的脚本运行实现方法,包括以下步骤:

步骤1:增加菜单项,得到鼠标右键“单个运行”的菜单项;

步骤2:给“单个运行”菜单项增加监听动作(监听动作包括步骤3~6);

步骤3:获取jmeter工具gui界面jtree组件被选中的节点路径数组a;

步骤4:根据节点路径数组a,获取被选中的节点路径的各级父节点路径和各级子级节点路径,得到需保留的节点路径集合b;

步骤5:遍历哈希树hashtree,根据集合b移除无用节点(非选中的节点),获得最终要测试的hashtree;

步骤6:调用启动引擎standardjmeterengine,配置hashtree,执行测试。

本发明采用上述技术方案,具备以下有益效果:

一、本发明能够很好的解决单个脚本调试过程中,jmeter工具自带功能,需要频繁“禁用”和“启用”的繁杂操作的问题;

二、基于jmeter工具源码开发了单个节点运行按钮,只需选中待调试的节点,右键点击“单个运行”,即可完成待调试的节点的单独调试,提高了脚本调试效率。

三、本发明同样适用于多节点调试,鼠标选中多个节点,右键点击“单个运行”,可完成多节点的单独调试。

附图说明

图1为jmeter工具软件gui界面示截图;

图2为添加“单个运行”的gui界面;

图3为jmeter工具的脚本运行实现方法流程图;

图4为被选中的节点路径数组a示例;

图5集合b示例;

图6最终集合b示例;

图7最终要测试的hashtreeb示例。

具体实施方式

本方案主要采用树操作完成对数据的筛选,下面对这些技术进行简单介绍。

jmeter工具gui界面mainframe左边的树,通过jtree组件以树形式显示数据,展示了各节点之间的层级关系(如图1),节点treenode包括threadgroup、testplan、resultcollector、debugsampler、configtestelement、headermanager、cookiemanager、responseassertion等测试元件。jtree类通过getselectionpaths()方法获得所有被选中节点的路径,该方法返回一个treepath类型的数组。

jmeter的测试脚本是jmx文件,保存了不同元件和变量的数据内容,在gui模式下可加载整个测试组件。hashtree是在内部存储文件信息的数据结构,是jmx文件在内存的一份映射。hashtree是jmeter执行测试依赖的数据结构。

本方案基于jmeter源码进行改造,故代码结构遵循jmeter源码结构。下面基于java开发语言,结合流程图3且以图2为案例对具体实施方式进一步阐述:

步骤1:增加jmenuitem菜单项,得到鼠标右键“单个运行”的菜单项(如图2),包含以下子步骤:

步骤1.1:在源码配置文件messages_zh_cn.properties中增加新配置项:run_by_one=单个运行;

步骤1.2:在源码动作名称文件actionnames.java中增加新动作名称:publicstaticfinalstringrun_by_one="run_by_one";

步骤1.3:在源码菜单管理文件menufactory.java中增加新菜单项:jmenuitemrunbyone=makemenuitemres("run_by_one",actionnames.run_by_one);menu.add(runbyone),得到“单个运行”的菜单项。

步骤2:给“单个运行”菜单项增加监听动作;

即在源码启动监听文件start.java的doaction(actionevente)方法中增加elseif(e.getactioncommand().equals(actionnames.run_by_one))的条件判断,在此条件中增加一系列监听动作,监听动作的实现在步骤3~6具体阐述。

步骤3:获取jmeter工具gui界面jtree组件被选中的节点路径数组a,具体操作如下:

步骤3.1:调用源码原有方法guipackage.getinstance()获取gui实例:guipackagegui=guipackage.getinstance();

步骤3.2:调用源码原有方法gettestplan()获取测试脚本哈希树:hashtreetesttree=gui.gettreemodel().gettestplan();

步骤3.3:调用jtree类的getselectionpaths()方法获得所有被选中节点的路径treepath[]paths=testtree.getselectionpaths(),本例子选中图1节点“01-01”,则被选中的节点路径数组a,如图4。

步骤4:根据被选中的节点路径数组a,获取被选中的节点路径的各级父节点路径和各级子级节点路径,得到需保留的节点路径集合b,具体操作如下:

步骤4.1:先定义要运行的节点路径数组为集合b,arraylisttreelist=newarraylist(),然后循环遍历数组a,每个循环的操作包括步骤4.2和4.3;

步骤4.2:获取被选中节点路径及各级父节点路径,并加入集合b,对数组a中的每个子项paths[i]进行以下操作:

步骤4.2.1:定义临时变量pathtemp,treepathpathtemp=paths[i],该临时变量用于下面的循环赋值,通过getpathcount()获得路径中包含节点的数量,进行循环遍历for(intj=0;j<paths[i].getpathcount();j++);本例子节点“01-01”路径中的节点数量为5,则循环次数为5次,每个循环中的操作包括步骤4.2.2;

步骤4.2.2:首先把pathtemp加入集合b中,然后判断父节点路径是否符合条件(父节点路径为空,或者父节点路径最后一个节点为线程组),即if(pathtemp.getparentpath()==null||pathtemp.getparentpath().getlastpathcomponent().tostring().contains("threadgroup")),符合条件则break跳出循环,不符合条件则把父节点路径赋值给临时变量pathtemp=pathtemp.getparentpath(),然后进入下一次循环;

本例步骤4.2获得集合b如图5。

步骤4.3:获取被选中节点路径的各级子节点路径,并加入集合b,对数组a中的每个子项paths[i]进行以下操作:

步骤4.3.1:通过node=(jmetertreenode)paths[i].getlastpathcomponent()获得路径中最后一个节点的对象;

步骤4.3.2:定义递归函数getcurrentsubtreepath(jmetertreenodenode,arraylisttreelist)获取节点node的子节点,函数首先定义枚举值enumeration<testelement>enumnode=node.children(),进行枚举循环while(enumnode.hasmoreelements()),循环中的操作如下:获取当前节点的子节点和路径jmetertreenodechild=(jmetertreenode)enumnode.nextelement();treepathtreepath2=newtreepath(child.getpath()),把子节点路径加入集合b中treelist.add(treepath2),然后调用递归函数getcurrentsubtreepath(child,treelist)获取子节点的子节点,递归直到获取各级子节点路径。本例子该步骤获得最终集合b,如图6。

步骤5:遍历哈希树hashtree,根据集合b移除无用节点(非选中的节点),获得最终要测试的hashtree。定义递归函数removenoselecttree(hashtreetree,arraylistpathlist),函数中循环遍历哈希树hashtree,即步骤3.2获取的testtree,每个循环中的操作步骤包括如下:

步骤5.1:首先设置标志booleanischoosed=false,用于判断该树节点是否需要保留;

步骤5.2:判断节点是否包含“threadgroup”、“testplan”、“resultcollector”、“debugsampler”、“configtestelement”、“headermanager”,“cookiemanager”中的任意一个,条件成立则设置标志位ischoosed=true,即该节点需要保留,条件不成立则进行步骤5.3;

步骤5.3:判断节点路径是否在集合b中,条件成立则设置标志位ischoosed=true,即该节点需要保留,不成立无需操作;

步骤5.4:若ischoosed=true成立,则以当前节点为根节点,调用递归函数removenoselecttree(tree.gettree(item),pathlist),递归保留所有节点;

步骤5.5:若ischoosed=true不成立,则移除该树节点tree.remove(item)。

本例最终要测试的hashtree如图7。

步骤6:调用启动引擎standardjmeterengine,配置hashtree,执行测试。该步骤调用方法standardjmeterengine()获取实例engine,然后调用engine.configure(tree)配置hashtree,调用engine.runtest()执行测试,这些方法是jmeter源码原有方法,故不做具体阐述。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1