一、前言:
我们在做测试工作的时候难免会遇到重复性比较高的用例,比如购买不同商品然后查看购物车里面的金额;录入不同订单后调用查询接口查看数据正确性;不同订单不同时间核销后对比订单状态等
场景共同性:无非就是不同的数据进行相同的场景操作,然后对比用例结果;人工测试的话肯定会消耗大量时间(三千的工资干三千的活儿的道理我是懂的,我是为了让你们有更多的时间用来摸鱼!!抵抗资本,享受美好生活)
当然有很多方法实现自动化测试,但是今天教大家一个我认为最简单的自动化脚本编写方法
二、脚本逻辑
可以举例的场景有非常多,我就拿我们公司做的物流平台,测试物流运单运单录入场景给大家举例;只要脚本会写,场景都可以举一反三
下面是我们要实现的自动化场景测试用例,这里大家可以理解为只是一些运单录入的各种场景,然后判断测试结果,并将测试报告输出到本地
脚本实现步骤:
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判断条件未通过时,返回的信息
至此基本已经完成了,然后我们点击运行,查看结果;来吧,希望不要报错!(记得在代码里面修改存储本地文件的路径)
可以看到接口全部都请求成功了(奈斯)
然后再来查看本地文件中的结果查看测试是否通过;
可以看到是全部都通过了,如果想要查看具体接口返回的哪些信息,可以在列表中其他列查看;毕竟咱们的代码里面也有输出
到此脚本已经编写完成了,写这个文章用了我一下午的时间(刚好消遣一下时间,摸鱼写的)
大家学会的还望点个赞!!,有啥不明白的可留言