如何使用Jmeter做自动化测试并输出测试报告(超详细)

一、前言:

我们在做测试工作的时候难免会遇到重复性比较高的用例,比如购买不同商品然后查看购物车里面的金额;录入不同订单后调用查询接口查看数据正确性;不同订单不同时间核销后对比订单状态等

场景共同性:无非就是不同的数据进行相同的场景操作,然后对比用例结果;人工测试的话肯定会消耗大量时间(三千的工资干三千的活儿的道理我是懂的,我是为了让你们有更多的时间用来摸鱼!!抵抗资本,享受美好生活)

当然有很多方法实现自动化测试,但是今天教大家一个我认为最简单的自动化脚本编写方法

二、脚本逻辑

可以举例的场景有非常多,我就拿我们公司做的物流平台,测试物流运单运单录入场景给大家举例;只要脚本会写,场景都可以举一反三

下面是我们要实现的自动化场景测试用例,这里大家可以理解为只是一些运单录入的各种场景,然后判断测试结果,并将测试报告输出到本地

脚本实现步骤:

1、使用CSV元件获取本地测试用例

2、循环调用运单录入接口获取本地CSV文件创建测试数据

3、循环调用查询接口,对比运单录入的数据与录单成功后查询接口返回的运单信息

4、使用BeanShell后置处理器输出测试结果

三、CSV测试元件

添加“CSV 数据文件设置”

文件名:CSV本地文件路径,可以直接新建一个.txt文本,填入录单接口需要传入的测试用例数据参数

文件编码:UTF-8

变量名称:与本地CSV文件中的参数字段对应

忽略首行:是否需要忽略掉CSV文件中的首行(标题/参数名称)

分隔符:每次循环调用对应参数的区别符

是否允许带引号?:参数是否带了引号

遇到文件结束符再次循环?:CSV文件中的数据调用完以后是否需要重头开始,建议False;相同场景重复调用无意义

遇到文件结束符停止线程?:CSV文件中的数据调用完以后是否停止当前线程的测试工作,建议True

线程共享模式:是否将CSV文件中的参数设为全局变量,建议所有线程

没有接触过Jmeter的小伙伴可能会有点看不懂;有基础的小伙伴的直接跳过这里进入下一个目录,接下来用baidu.com给大家介绍一下CSV这么一个特别*的测试元件;明白使用以后大家自行举一反三

首先本地随便创建一个Execl文件或者txt文件,然后将文件后缀修改为.csv

——>——>

下面这是文件里面的内容;

然后我们开始配置CSV元件(重点)

上面表格中第一行为参数注释说明对应CSV配置元件中的“忽略首行:”如果第一行没有写注释名称直接就是参数,那么此项就选择False

变量名称:”设置CSV文件中的参数变量名称;就是代表文件中的(Java,Python,Jmeter.....)

如果文件中有多个变量(即有多列时)变量中间用逗号隔开

接下来添加HTTP请求,配置baidu.com

${search}为Jmeter调用变量固定写法,使用“${变量名称}”包括;

search就是前边我们在CSV元件中自行配置的名称,要统一对应。多个变量用逗号隔开

然后添加“查看结果树”用于查看接口请求

接下来配置一下线程组

线程数:代表每次测试周期发送的请求次数

Ramp-Up时间(秒):代表每个测试周期,如线程数设置为1,这里也是1,那么就是每个测试周期都是在一秒钟内请求一次;

循环次数:勾选永远就代表脚本会一直执行下去;如果后边有规定次数就代表脚本执行规定次数后就会停止测试;

注:CSV文件中我们添加了有(Java,Python,Jmeter.....)五个参数,实际测试中我们如果不确定有多少个测试数据,那么就将循环次数的永远勾选上,这样就能确保CSV文件中的每个参数均能够被调用,但是这样就需要把CSV元件配置中的结束符配置改为False;如果为True的话脚本就会一直执行下去,陷入死循环

接下来迫不及待的开始执行脚本吧!!!

可以看到我们的脚本一共发送了五个请求,分别对应文件中的(Java,Python,Jmeter,MySql,Postman),且请求中也成功调用了CSV文件中我们自定义的参数,那么 就表示我们成功迈出了第一步,可以使用接口自动化调用本地测试数据了

如果你学会了CSV这么一个测试元件的话,你就可以使用这个牛*轰轰的工具来进行自动化入门测试了

是不是特别easy! 接下来我们运用到实战

四、自动化测试

获取token

1、添加“HTTP请求默认值”,主要用于多个接口存在同样的用户参数或IP地址的情况;即在该元件中添加的默认值,在其同级或子级关系的HTTP请求中均能够被默认调用,使脚本更简洁明了;

2、获取登录接口返回的token用于后续有登录限制的接口调用

        2.1、添加CSV元件设置不同登录账号,模拟不同网点录入运单的场景

每列数据对应CSV元件中对应顺序位置的变量名称,这点就不过多阐述了,上面已经讲过了

        2.2、查看登录接口返回文本,并使用Json提取器获取对应的token值

        在查看结果树列表显示格式中选择“JSON Path Tester”,该格式支持JSON语句查询返回文本

        JSON Path Tester:用于查看接口返回的文本信息(已转为JSON格式)

        JSON Path Expression:编写查找对应值的JSON语句,点击Text后在下方查看获取到的值

        可以看到我们要获取的token在rows字段子级下方,那么JSON语句应该就是"$.rows.token"

        2.2.1、JSON语句:

                        .  代表绝对路径,即按照父子级关系进行查找语法为:$.父级.子级.要查找的字段

                        .. 代表相对路径,即可以直接从子级关系开始查找语法为:$..要查找的字段

        

 下面验证一下我们的JSON语句是否获取到我们想要的token

                可以看到我们成功获取到了想要的token值,那么该如何设置为变量呢?

        2.2.2、添加JSON提取器

                

        Names of created variables:设置获取到值得变量名称,用于后期调用

        JSON Path expressions:用于查找对应值得JSON语句

        Match No. (0 for Random):调用获取到的第几个值可在这里设置;0代表随机

        Default Values:JSON语句未获取到值时,设置用于调用的默认值,可为空

根据用例录入不同运单测试数据

1、添加运单录入接口需要的CSV元件并添加接口参数,当然了也可以与登录接口写在一个表格里面,我是用于区分所以写了两个,大家根据情况自己定;这里不过多阐述了与登录接口操作基本一致,无非就是参数不同,因为我们项目运单录入接口所需参数比较多,这里的表格中列也比较多,大家根据自己的情况设定

2、添加运单录入接口,并从中调用CSV文件中的参数

3、添加HTTP信息头管理器,用于传入接口请求所需的请求头,包括前边登录接口获取到的token

注:这里只做演示,具体接口需要传什么参数,大家根据接口文档或者F12查看

到这里运单录入已经完成了,只需要在CSV配置元件中即可直接设置各种不同场景的录入

查询接口对比录入前后信息

1、添加查询接口HTTP请求,并从运单录入接获取返回的order_id、order_no,传入到查询接口中(只是我这个项目需要到这个接口判断以及查询接口需要这两个参数,大家根据自己的情况而定)

然后调用查询接口查看返回数据

判断逻辑:因为我们是通过CSV表格中的数据进行录单的,所以想要判断接口是否按照我们传入的值进行录单的话,直接调用查询接口依次查询我们每次录单后运单详情是否与CSV表格中的数据一致即可(这里只是举了一个例子,具体实际场景大家根据情况编写脚本,无非就是接口你们调整一下)

2、获取查询接口返回的数据并判断查询接口返回的信息与CSV中信息一致;

首先要获取到全部需要判断的字段值(其实是可以直接写在一个JSON提取器中的,多个公式用逗号隔开即可,我是为了方便区分才这么写的,这么写不是很美观,也比较麻烦,大家自己绝定怎么写就行)

3、判断查询接口与CSV元件中的运单信息是否一致;(重点)

        3.1、添加“BeanShell 后置处理程序

写入代码:

import org.json.JSONObject;
 
//写入文件
//本地存储文件路径
FileWriter fs=new FileWriter("D:/Wsh/Jxx/jxx.csv",true); 
BufferedWriter out=new BufferedWriter(fs);
 
//提取出来的值,换列
out.write("时间:${__time(yyyy-MM-dd hh:mm:ss,)}");//用于输出接口请求当前时间
out.write(",");
out.write("运单号:${orderNo}");
out.write(",");
out.write("付款方式:${amountFreightPtl}");
out.write(",");
out.write("运单类型:${bizModel}");
out.write(",");
out.write("运单状态:${orderStatusl}");
out.write(",");
out.write("应收运费:${totalAmountl}");
out.write(",");
out.write("支付状态:${xfyjHkStatusl}");
out.write(",");
out.write("送货方式:${deliveryTypel}");
out.write(",");
out.write("送货费用:${amountShfl}");
out.write(",");
out.write("送货方式:${nodeName}");
out.write(",");
out.write("代收款:${amountCodl}");
out.write(",");
out.write("发货部门:${billDeptNamel}");
out.write(",");
out.write("到货部门:${discDeptNamel}");
out.write(",");
//用于将用例通过的判断条件可视化,同样也写入到本地文件中
out.write("付款方式${amountFreightPt}=${amountFreightPtl};发货部门${billDeptId}=${billDeptIdl};到货部门${discDeptId}=${discDeptIdl};代收款${amountCod}=${amountCodl};送货费${amountShf}=${amountShfl};付款方式${amountFreightPt}=${amountFreightPtl};送货方式${deliveryType}=${deliveryTypel}");
out.write(",");
//判断条件,前面为运单录入的CSV信息,后面为查询接口返回的运单信息;相等则返回通过,反之则不通过
if("${amountFreightPt}"=="${amountFreightPtl}" && "${billDeptId}"=="${billDeptIdl}" && "${discDeptId}"=="${discDeptIdl}" && "${amountCod}"=="${amountCodl}" && "${amountShf}"=="${amountShfl}" && "${amountFreightPt}"=="${amountFreightPtl}" && "${deliveryType}"=="${deliveryTypel}"){
            //"测试通过";
            out.write("通过");
        }else {
            //测试不通过
            out.write("不通过");
        }
out.newLine();  // 添加换行符
 
out.close();
fs.close();

因为Jmeter是纯Java语言开发的,同样的也是默认仅支持Java语言,其他语言可自行搜索下载第三方插件也可以实现支持其他语言(如Python语言需下载Jython插件)

这里的代码其实也不难,我也是找别人给我写的,毕竟咱只是一个单纯的测试,代码能力有待提高;但是也不难理解,

out.write("")里面的均为让查询接口返回的运单信息写入到本地文件,并非判断这里的内容
if("")语句,用于判断运单录入的信息与查询接口返回的信息是否一致,可自行在后面继续加判断条件;只需要每个条件中间用"&&"隔开即可
else,在if判断条件未通过时,返回的信息

至此基本已经完成了,然后我们点击运行,查看结果;来吧,希望不要报错!(记得在代码里面修改存储本地文件的路径)

可以看到接口全部都请求成功了(奈斯)

然后再来查看本地文件中的结果查看测试是否通过;

可以看到是全部都通过了,如果想要查看具体接口返回的哪些信息,可以在列表中其他列查看;毕竟咱们的代码里面也有输出

到此脚本已经编写完成了,写这个文章用了我一下午的时间(刚好消遣一下时间,摸鱼写的)

大家学会的还望点个赞!!,有啥不明白的可留言

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值