新手区 对 Jenkins+ANT+Jmeter 接口测试的实践

terrychow · June 24, 2016 · Last by newair09 replied at August 08, 2019 · 7282 hits
本帖已被设为精华帖!

1、前言

最近感觉大家都在讲Jenkins+jmeter+ant或maven的使用,但没有说到具体怎么投入到项目使用,只有比较基本的流程说说,所以我今天要说的就是我是怎么将这个方案投入到实际中使用的,先说明一下,本人是今年4月份才开始学jmeter和ant,之前做性能测试是用loadrunner,接口测试使用RobotFramework+Request来做的,loadrunner用来做简单接口测试太笨重而且成效不高,RobotFramework+Request虽然可以使用数据驱动模式,但测试报告就会显示很鸡肋,因为基本是一个测试用例在循环,所以后面使用了Jenkins+jmeter+ant的方案

2、框架与数据准备

在做接口测试框架之前,我研究了一下jmeter工具特征和本身项目接口的特征,jmeter是以请求为单位,不是以脚本或测试用例为单位,既然这样,我就可以每次循环获取接口或对应数据进行测试了,加上之前在testerhome上看到一些大神写的接口测试框架,其实框架是死的,思想是活的,利用这个活的特点,后面就想了一套比较简单的框架,可以看下图

是的,我的测试数据是用Excel管理的,Excel的测试数据可看下图


从数据格式可以看出,做了用例的执行标识,选中为YES时才执行,NO时不执行,这是一个用例选择执行的简单设计,还有请求的方法也是可以选择的,目前项目中的主要用POST和GET,除此之外之后要获取的还有用例名,调用的接口和具体的测试请求数据,这就是使用excel管理测试用例的模块
数据准备好以后做一些全局或初始的配置,一般就是改jmeter.properties里面对应的配置


是的,里面这行本来是默认指定为user.properties,但有自己个性化的需求,例如服务器和测试账号

配置基本完成,之后就是项目的目录架构,conf就是放配置文件的,如myuser.properties,jmx就是对应的脚本,report是输出的测试报告路径,res是一些上传文件所用的测试资源等,test_data是为后期性能测试作准备的,现在先忽略,test_suite就是放excel表格的,build.xml就不多说了,就是ant的执行文件

3、脚本设计

好吧,接下来就是jmx脚本的设计,如下图,这是一些变量的设置

还有上文提到用myuser.properties配置的,这些在jmeter中作为变量来使用

然后对于读取数据,我是用了beanshell写了简单的java读取excel的脚本构建起与测试数据的连接,首先是先获取测试用例数,用于设置执行循环请求的次数,这里是用前置处理器的方式获取数据的,前置处理器需要sampler紧接着在其后使用,不然是不会执行的,所有我把它放在了登录的请求里面


具体的代码:

String filename=vars.get("test_data");
String [] datalist=new String[20];
String content;
InputStream openfile = new FileInputStream(filename);
Workbook wb = Workbook.getWorkbook(openfile);
Sheet FirstSheet = wb.getSheet(0);
int totalRows=FirstSheet.getRows();
int rows=totalRows-1; //减1是因为我标题行不取,为了后面从第二行开始取
String data=rows.toString();
vars.put("row",data); //用例行数
wb.close();

然后获取正常的测试数据是用beanshell sampler,这个有个大坑,就是用sampler来获取数据的话到时在测试报告会显示出来,但实际上其不是测试用例,后面会说我目前是怎么破的,反正取数据的操作最好就是不要显示在测试报告的统计上,这里就是取到刚才所说的测试用到的值,执行标识load,用例名称testcase,调用接口inter,请求方法method,请求数据request以及预期结果断言response,之前就将他们作为变量传到脚本当中


具体的代码(补充说明一下,取excel我是用jxl.jar去读的,但有部分小伙伴喜欢用POI去读,反正原理都是一样的,像在平时编写代码那样导入包就好了):

int i;
int k=0;
String [] datalist=new String[20];
String content;
String filename=vars.get("test_data");
String str=vars.get("rownum");
int row = Integer.parseInt(str);
InputStream openfile = new FileInputStream(filename);
Workbook wb = Workbook.getWorkbook(openfile);
Sheet FirstSheet = wb.getSheet(0);
for(i=1;i<9;i++){ //9是因为我表格就是9列的
if (i!=5&&i!=6){ //表格中白色的两行不取
Cell oCell= FirstSheet.getCell(i,row);
content=oCell.getContents();
datalist[k]=content;
k++;
}
}
vars.put("load",datalist[0]); //标识
vars.put("testcase",datalist[1]); //用例名称
vars.put("inter",datalist[2]); //接口
vars.put("method",datalist[3]); //请求方法
vars.put("request",datalist[4]); //请求数据
vars.put("response",datalist[5]); ///断言校验
return content;

执行的效果如下图,开始在登录完之后拿到测试用例的数量,作为循环的次数,做个计数器用来excel行的遍历,使用if控制器判断执行方法,如果是YES的话才执行请求,如果method是POST就是执行POST请求的http sampler,GET就执行GET请求的http sampler,然后输出的请求结果会有对应的用例名称,最后在响应断言中填上response变量,基本的脚本设计就完成了


具体http请求也是很简单的


4、整理测试报告

脚本设计完以后,用ant去执行jmx就可以了,至于怎么用ant去执行我就不多说了,去网上搜一下大把的教程,我这里是同时输出了两份测试报告,一份是作简单的统计用,就是jmeter-results-detail-report_21.xsl那份


6月28日更新的测试报告,统计线程组执行的请求数,更符合当前脚本测试用例的统计形式


8月5日更新测试报告样式,继续慢慢优化


还有是查看测试数据详情用的,就是jmeter-results-shanhe-me.xsl,两份报告之间做了一个比较简单的跳转,方便查看


其实在这里我是用了比较取巧的方法把之前取数据的sampler过滤掉了,不输出到html测试报告,打开输出的jtl看一下你就懂了


所以两份测试报告我也做了一些手脚,但这个不是明智的方法,只不过是没有办法中的办法,就是去改上文的两个xsl
统计的


查看数据的

其实这些也是我之后要优化的地方,只是目前太急要出个方案罢了


说了那么多,还没说到jenkins,至于怎么使用,可以看我之前写的文章:https://testerhome.com/topics/5099,大同小异,就是这样用就好

5、结束语

目前我所说的设计耗时不到两天,因为时间比较紧,就只能想出目前这个方案了,大家可以也留意到其实有很多地方是可以优化的,不过目前时间实在有点紧,所以目前只能在接口自动化测试的过程中不断地去优化框架,优化设计,毕竟目前对jmeter的使用也不是非常熟悉,才用了2个月,也希望大家多给我建议,让我可以用更好地方法去实践接口自动化测试,我只是个工作不到一年的新人,很多东西想不全是会有的,这里有很多大牛,都很值得我去学习,最后还是说那句,工具是死的,思想是活的,利用工具把自己的思想实例化为框架投入到实际应用中,这才是根本的道理,1000个人对jmeter可能有1000种用法,反正结合自己的思想和实际,总可以找到工具的价值,好,欢迎大家卖力地吐槽我,让我能好好反思一下设计上的问题,继续优化

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
最佳回复

楼主 问一下 我用3.3版本的jmeter 用你的bean shell 语句执行的时候报错,提示:ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import java.awt.List; import java.io

.FileInputStream; import java.io

.FileNotFo . . . '' : Typed variable declaration : Method Invocation Workbook.getWorkbook,楼主知道是什么问题吗,感谢

共收到 102 条回复 时间 点赞
恒温 将本帖设为了精华贴 25 Jun 01:37

有些代码的图 可以贴代码吗?

#2楼 @lihuazhang 因为可以说明一下对应使用的Sampler,我补一下就好了,谢谢提点

—— 来自TesterHome官方 安卓客户端

感觉不太适合业务场景的case?请求依赖上一个请求的结果呢

使用markdown吧,方便点看代码

#4楼 @pacerron 是的,所以我说了是简单接口的测试,如果是业务场景的话,就用回老方式吧,我现在也在做框架,业务场景可以用来跑性能,这些其实我都有考虑到的

—— 来自TesterHome官方 安卓客户端

#5楼 @jphtmt 好的,我先学习一下怎么用吧,谢谢提点

—— 来自TesterHome官方 安卓客户端

#4楼 @pacerron 简单接口更贴近单元测试,业务场景测试的话贴近功能集成,最好还是两种形式都做起来,更好地覆盖测试

—— 来自TesterHome官方 安卓客户端

#8楼 @terrychow 感觉都这样了,还不如自己写一套测试单接口的 来的自由

terrychow #10 · June 26, 2016 作者

#9楼 @pacerron 是的,我感觉自己写也是会好一些,但写了还要自己维护,而且只有两天时间,写的话不仅是脚本,还有测试报告数据关联等东西要考虑,既然都做接口测试了,为何不把性能测试也留个切入点,如果能用两天把unittest和multi_mechanize或locust结合起来做接口性能测试框架的话,那也是可以的呀,但考虑的东西就没那么简单了,有时候工具能用就直接用了,没必要去搞那么多耗成本的,工具弄出来还不是自己用的,要结合自己项目实际和team的实际考虑,有现成的,还是先用着吧

你的断言这么简单?

terrychow #12 · June 26, 2016 作者

#11楼 @pacerron 测试用例那里可以控制的,写复杂一点可以的

—— 来自TesterHome官方 安卓客户端

@terrychow jmeter-results-detail-report_21.xsl和jmeter.results.shanhe.me.xsl在build.xml中调用才可生成html报告
格式如:



那么如你所说生成两份报告,如果直接添加则对应提示错误:
[xslt] [Fatal Error] jmeter.results.shanhe.me.xsl:121:26: 元素类型 "xsl:if"
必须后跟属性规范 ">" 或 "/>"。无法生成
不知你这里如何实现两份html的生成,还有页面的跳转:

Designed for use with JMeter and Ant.变更为第二份详细的怎么判断跳转你生成的报告?
terrychow #14 · June 28, 2016 作者

#13楼 @geyesheng 两份报告是这么输出的,跳转的话一般固定好输出的html名称就好了,在jmeter-results-detail-report_21.xsl,里面改,这里是参考了RF的report和log的跳转逻辑,虽然不完全,但已经足够使用
跳转也很简单,jenkins要用的时候把两份都上传了就好

@terrychow 👍 非常感谢!不知能否将build.xml及配置的xml内容提供参考下

terrychow #16 · June 29, 2016 作者

#15楼 @geyesheng build.xml我是直接拿jmeter extras文件夹中那个模拟做的,几乎一样,改一下路径和定义一下参数就好了,配置那个可以看bin底下的user.properties,参考着做就行了

统计报告中过滤掉不需要的请求,有点不明白,你是修改的哪里,能否指点一二

想问下,这样子测试接口测试的方式,可以有办法去处理一些workflow的case吗? 比如说,一些不同单一http request case的组合case,如何用excel去组织管理这样的case?

#4楼 @pacerron 想问下,你说的那种依赖上一个请求的结果的业务场景的case,应该如何管理case然后实现自动化呢?

terrychow #20 · June 29, 2016 作者

#19楼 @jennyli90 特殊场景写特殊脚本,数据驱动可以减少重复的脚本数,但有些还是必须的,这个可以通过做用例组合,我现在也设计了,其实就是几个用例组合成一个用例组进行设计,像添加了一个表单之后删除一个表单。把两个用例组合起来用,脚本取特定的值做传递就行了,用例就以组为单位

terrychow #21 · June 29, 2016 作者

#17楼 @information 过滤的请求关键字是sampler,我目前用到的只是httpsamlper,所有在修改测试报告中红色框起来的地方就指明了是统计httpsampler的,然后第二份报告就判读如果请求名称是那个获取数据的,就不显示

@terrychow 感谢,按照你的方法已经解决

@terrychow 顾名思义就是业务组合测试或者叫场景测试,单一线程组里多个http的request请求,相互关联用正则取值上一个接口内容,但是有一个问题,就是sample统计实际的接口是存在误差的。能否加Q细聊一下?

@terrychow 或者你组织个群加进去共同讨论也可!

在第二份报告中我要过滤掉某些不需要的,<xsl:if test="@lb!= 这个地方我想用正则去过滤,比如aa开头的,我试了一下没有效果,楼主能否帮忙看下

terrychow #26 · June 30, 2016 作者

#25楼 @information 刚刚测试正则表达式是可以的,注意字符串等格式,有对应的结束符吧< /xsl:if >

terrychow #27 · June 30, 2016 作者

#23楼 @geyesheng 所以我就没有统计sample的,或者可以自己定制一些关键字来过滤,jmeter毕竟是开源的,只要知道哪部分是干什么的就可以二开了

@terrychow 我的写法 提示错误

@terrychow 原来正则写错了,谢谢

@terrychow 2853903588烦请添加下,谢谢!😀 👍

@terrychow 你设计的时候使用了前置处理器的方式获取数据行数,获取的数据是如何使用的,能否说明一下

terrychow #33 · June 30, 2016 作者

#31楼 @geyesheng 好的,有空加吧

—— 来自TesterHome官方 安卓客户端

terrychow #34 · June 30, 2016 作者

#32楼 @information 代码上面有写,写入到了变量${row}中,作为循环控制器的循环次数

#19楼 @jennyli90 自动化的不难,用jmeter的正则表达式取结果,变为变量

vars是要引用什么jar包吗

terrychow #37 · July 01, 2016 作者

#36楼 @information jmeter自带

—— 来自TesterHome官方 安卓客户端

你的java请求里面还有一个获取测试数据的对应行,在String str=vars.get("rownum");中引用的,请问一下,这个是如何处理的啊

发现一个奇葩的问题,使用正则或者json path 无法提取中文

terrychow #40 · July 02, 2016 作者

#39楼 @information 转码,或先设定为utf-8,int row = Integer.parseInt(str); 取得的str本来是多少行的意思,转回为整型,用来循环遍历

区曼 [Topic was deleted] 中提及了此贴 05 Jul 22:48

@terrychow 群主,方便把整个jmx发我参考一下吗?

terrychow #44 · July 11, 2016 作者

#42楼 @allanwendy 我在文章中已经展示出来啦,还是试试自己编写起来吧,不难的

#44楼 @terrychow 很多你的都没有展示出来哈,我是想拿过来参考一下下

学习了学习了。。。之前用Jenkins+soapui,后来用jenkins+ant+testng+httpclient完成的

terrychow #47 · July 12, 2016 作者

#46楼 @leeforleslie 我是为了简化代码工作量,本来也想用python写框架做,后面还是算了,能用的工具不用白不用

int i;
int k=0;
String [] datalist=new String[20];
String content;
String filename=vars.get("test_data");
String str=vars.get("rownum");
int row = Integer.parseInt(str);
InputStream openfile = new FileInputStream(filename);

Workbook wb = Workbook.getWorkbook(openfile);
Sheet FirstSheet = wb.getSheet(0);
for(i=1;i<9;i++){ //9是因为我表格就是9列的
if (i!=5&&i!=6){ //表格中白色的两行不取
Cell oCell= FirstSheet.getCell(i,row);
content=oCell.getContents();
datalist[k]=content;
k++;
}
}
vars.put("load",datalist[0]); //标识
vars.put("testcase",datalist[1]); //用例名称
vars.put("inter",datalist[2]); //接口
vars.put("method",datalist[3]); //请求方法
vars.put("request",datalist[4]); //请求数据
vars.put("response",datalist[5]); ///断言校验
return content;

这段代码执行报错
Response code: 500
Response message: org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import java.awt.List; import java.io.FileInputStream; import java.io.FileNotFoun . . . '' : Typed variable declaration : Method Invocation Integer.parseInt

你好,按照你所描述的方法,我能把整个到用ant 产生报告一个html都能搞定,最后想问下报告html最后你们是怎么处理展示的?我们组持续集成用的是bamboo,然后没有找到有插件可以用来显示,如果是用ant 发邮件的话,带javascript的html似乎无法在邮件中显示。。想问下有没有什么推荐的处理方式?

#49楼 @jennyli90 集成到Jenkins中,通过插件发布就行了。

terrychow #51 · July 15, 2016 作者

#49楼 @jennyli90 用jenkins是比较好的,有成熟的html测试报告的插件和jmeter测试报告的插件,不过如果不满足的话,只能自己拿到jtl的数据自己做一份,我对robotframework+jenkins这种方式的时候就是自己做了测试报告

只有评论才能收藏?

@terrychow lz 我使用HTML Report,点开是404 Performance Trend打开是空白的,有遇到过吗?

#50楼 @allanwendy 我用了jenkins report插件之后又遇到一个问题,没法让javascript和css正确的执行。。 你知道怎么解决吗?

terrychow #56 · July 22, 2016 作者

点开楼上的链接看看,专门说jenkins中测试报告看不到的处理的,RF也是,在系统设置执行脚本命令那里跑一下就好

—— 来自TesterHome官方 安卓客户端

#56楼 @terrychow 不好使啊,还是不行

#54楼 @jennyli90 我现在也是这样,页面样式都乱了,跑了一下楼下哥们的连接,感觉还是不行

terrychow #59 · July 26, 2016 作者

#58楼 @allanwendy @jennyli90 ,再不行就shift+F5刷新一下测试报告页面,都不行的话重新build一次看看

#54楼 @jennyli90 插件支持的Jenkins版本的问题,你看看

#60楼 @allanwendy ok,多谢,搞定了,之前不知道咋回事,多谢多谢

#54楼 @jennyli90 按照楼上的就行了,跑一下脚本,我的正常了

结果报告怎么发出去呢 用ant的发邮件功能还是jenkins的发送邮件的插件呢

#63楼 @huiyiditou 用ant和jenkins发送邮件都只能发附件或一些简单的信息,但具体的数据还是要下载附件或者去到jenkins 上面查看,后来我自己做了一份测试报告,直接以html格式作为邮件正文发送,可以用python爬虫爬取jenkins 上的报告,或者自己解析jtl拿到具体数据来做测试报告,我目前使用第一种方法

jmeter-results-shanhe-me.xsl 求分享这个文件~~谢谢楼主大大

收藏了

#4楼 @pacerron 可以用Jmeter的关联去解决

区曼 Ant+JMeter+WebDriverAgent 游记 中提及了此贴 22 Dec 14:08

@terrychow ,获取测试数据对应行,怎么写的。

正好我也有需求要做Jmeter+ant+Jenkins的自动化接口测试。
不同的是我的用例信息保存在数据库里,数据来源不同,搞了一天。

楼主最主要的细节没写:获取测试数据对应行。
我的做法是:获取count循环数量的同时,获取数据的ID主键集合,用逗号分隔保存在一个变量里。
获取测试数据对应行时,同时保存及设置用户变量index,index从0开始计数。
index是ID主键集合的索引,由于已经根据逗号分隔过了,很容易取到。
再根据得到的ID主键来获取数据行,完成用户参数的初始化。

再说一下,其实报告的模板我没修改得像楼主这么麻烦,我就是把beanshell samper的名称改成了空格,自动就过滤掉了。

还有if逻辑控件,注意是 == 号。

有时间我也出一个JDBC的接口测试实践。

terrychow #72 · March 15, 2017 作者

其实我已经有更好的方案了,这个早已弃用😂

terrychow 回复

能出一个帖子share一下idea吗

@terrychow 可以贴一下 获取测试数据对应行 的代码吗?O(∩_∩)O谢谢

@information 可以贴一下 获取测试数据对应行 的代码吗?O(∩_∩)O谢谢

@zyanycall 可以share一下你的ideal吗

测试大牛哥!能把jmx脚本分享一下吗?最近再学习跪求了

terrychow 回复

大哥跪求jmx脚本

朱欢 回复

你好,报错解决了吗?

terrychow #80 · June 11, 2017 作者
W 回复

我今天有空的话放网跑给吧

terrychow 回复

感谢感谢

terrychow #82 · June 11, 2017 作者
W 回复

链接:http://pan.baidu.com/s/1i5423zB 密码:0zkz jmx要配合好execl和jtl的测试报告,剩下的就自己看看吧

terrychow 回复

收到了 测试大牛哥 学习了 感谢🙏

terrychow 历历在目的 2年 测试生活 中提及了此贴 13 Jun 12:04

赞!!! 我也做了个类似的东东,底层技术都比较简单的。 框架也自带了数据驱动+函数封装关键字驱动(用模块控制器模拟函数的功能)。 传送门:《脑洞大开:JMeter_xunit 接口自动化框架》 https://testerhome.com/topics/8761

@terrychow 你在另外1个帖子里录制的gif图片是用什么工具录制的?

https://testerhome.com/topics/9110

看帖子,7月份就没人回复了啊

@terrychow 你的测试Excel表格 ,方便发我一份不? 我参考一下你的用例设计

今晚发一下

胖虎 回复

LICEcap

链接: https://pan.baidu.com/s/1nvR3YDr 密码: h9mg,上去取一下吧

terrychow 回复

多谢多谢哈

楼主 问一下 我用3.3版本的jmeter 用你的bean shell 语句执行的时候报错,提示:ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import java.awt.List; import java.io

.FileInputStream; import java.io

.FileNotFo . . . '' : Typed variable declaration : Method Invocation Workbook.getWorkbook,楼主知道是什么问题吗,感谢

朱欢 回复

哈喽 问一下 你的问题解决了吗?我也遇到跟你一样的问题😟

您好,请问您的报告现在优化成什么样的了,想把测试结果以excel表的格式展示用例名、方法、执行结果、comments这种形式,应该怎么优化呢

追梦 回复

已弃用jmeter做接口测试😅 ,不过可以看jtl这个原数据,是个xml,读xml写进入excel就好

操作不方便,最近社区已经有很多厉害的小伙伴做了一些接口自动化测试平台,比如httprunner,用这些更好

terrychow 回复

我还以为你弃用Jmeter是业务不对头呢……对接口测试,现阶段的Jmeter比httprunner好多了。你还来了一句操作不方便……别误导别人了好不好。说些肯定能遇到的:httprunner面对循环重复请求要怎么做?断言的正则表达式怎么做?出了问题怎么debug?怎么搞定时器?不是http(s)协议怎么办?遇到需要校验数据库/缓存变动,只需要一个简单的SQL,并不是http请求怎么弄?怎么实时看到访问结果,如果有1000个请求前2个就失败了而不需要执行后面的998个以免脏数据httprunner要怎么做?
这些问题你要打开IDE,自己造轮子了?
我都不用说locust的测试性能有硬伤,协程+脚本语言性能的硬伤,上面这些你都搞不定,要二次开发。
别简单一句这些更好,你到底做没做过接口测试,我都怀疑。
如果是你业务不符合,就说业务的问题,别扯工具能力。

zyanycall 回复

然后呢,你来教教我怎么做吧,谢谢哈😁
我的一切观点都是主观的,觉得有用拿去,错了,没关系,和我说说也挺好的,我也思考一下,但这个需要自己判别哈,这点判别能力一个正常的成年人都还是会有滴
如果我真能误导人,那我挺佩服自己的😁

terrychow 回复

你直接用Jmeter就都有这些功能了。

102Floor has been deleted

想问下楼主, 你说的更好的方法是什么? 能分享一下吗?感谢!

我也做了一套和楼主差不多的 ,目前就是对数据复用进行回归测试没办法,还有就是业务场景,多接口依赖关系也没好办法

楼主修改后的测试报告模板可以发一下吗?

@terrychow 楼主完整的工程jmx和报告可以参考下么 非常感谢

测试大神,可以把整个工程给我学习一下么,刚入门的菜鸟,很慌,万分感谢

W 回复

你好,可以给楼主(terrychow )的《 对 Jenkins+ANT+Jmeter 接口测试的实践》的工程,我学习一下

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up