接口测试
前端
- iOS
- 安卓
后台
- java, python, php, .net
接口把client端和server端联系起来,两端之者使用的数据类型是json。
json是一种通用的数据类型,返回的格式为key-value,键值对,{"name":"张三","age":23"}
也有使用xml的,格式为:
<name>zhangsan</name> <sex>male</sex>
测试接口之前,得有一个接口文档,文档中有请求方式,请求参数,响应信息等。
功能测试测的是业务逻辑。接口测试属于业务测试中一种。
- 关注业务逻辑
- 正常的,异常的
如果是get请求,不需要借助任何工具,只需要用流星器就可以发送请求
http://api.xxxx.cn/api/user/stu_info?stu_name=小黑
返回结果如下:
{ "error_code": 0, "stu_info": [ { "id": 5671, "name": "小黑", "sex": "男", "age": 28, "addr": "河南省济源市北海大道32号", "grade": "天蝎座", "phone": "18799932946", "gold": 120054446 } ] }
请求中格式为http://ip:port/路径/接口名?key1=value1&key2=values2
。如果有多个参数中间用&连接多个参数
使用postman发送请求
postman的body中form-data和x-www-form-urlencoded区别:
- 只传key-value格式时两者无区别
- form-data除了可以key-value外,还可以传file等多媒体数据
- x-www-form-urlencoded只支持key-value格式
POST请求
入参为json类型,body中选择raw,JSON类型,如未标明,使用key-vaule格式
cookie,放在本地的一个键值对,请求时发送cookie中的sessionId与服务端sessionId进行匹配,匹配成功则通过验证。
session,放在服务端的一个键值对,有一个过期时间。
查看Cookie信息,通过浏览器F12可以看到存储的cookie信息
添加Cookie信息,在Headers中添加Cookie信息
添加header信息
文件上传
POSTMAN全局变量
使用方式
DNS, HTTP协议,三次握手,4次挥手
HTTP请求分为两个部分,请求头和请求体,请求头中是一个额外的信息,比如浏览器类型,cookie等。请求体中传的是具体的数据。
- GET请求只有请求头,没有请求体。它的数据直接放在url中。POST请求放在body中。
- GET请求有长度限制,POST请求没有长度限制。
- GET请求没有POST安全,但通过抓包都可以看到信息。
请求头(header):
- 额外的信息
- 浏览器
- cookie
- 需要什么样的数据
请求体(body):
- key=value
接口用例
HTTP状态码
- 200 请求成功
- 302 重定向
- 404 客户端请求不合法,页面未找到
- 500 服务端有问题
使用JMeter
Jmeter乱码处理
JMeter查看结果树中返回信息乱码在Jemter的bin目录下,jmeter.properties文件中添加sampleresult.default.encoding=utf-8,后重启jmeter。
JMeter中body data中乱码Jmeter的bin目录下,jmeter.properties文件中添加jsyntaxtextarea.font.family=Hack,后重启jmeter。
GET请求
POST请求
POST入参为JSON类型,如果避免插入到数据库中的中文为乱码,需要在Content encoding中填写utf-8。
添加cookie信息,cookie信息写在HTTP信息头管理器中,HTTP信息头如果放在线程组下与HTTP请求同级,则线程组中的所有请求都可以使用该HTTP信息头中的信息,如果放在某个HTTP请求下,则只对该请求单独生效。
添加Referer信息
文件上传,Jmeter 3.0以上版本需要填写MIME TYPE信息,随便填写就行,比如填写为text。
JMeter参数化
- 用户自定义的变量
函数助手中
- __Random
- __counter
- __time
- 从文件中读取
线程组->配置单元->用户自定义的变量,填写变量名和变量值
使用方式为${变量名}
使用函数助手中__Random函数成生随机数,在此例中由于压测用户注册功能,用户名是不可重重的,此处的随机数用于生成用户名后的数字
选项->函数助手对话框->__Random,输入最小值和最大值后,生成。
使用方式如下:
在线程组中循环5次,在查看结果树中可以看到5次请求中的用户名都不一样
使用计数器__counter函数进行自增
使用__time函数取时间,需要传入一个格式,yyyyMMddhhmmss,HH为24小时制,hh为12小时制
时间表示
- 格式化好的时间 201904161004
- 时间戳,在__time函数中不对其进行格式化出来的就是时间戳,JMeter为Java开发,Java中时间戳默认是精确到毫秒,所以需要除以1000才是真真的时间戳。
从文件中读取数据
有场景需要大批量数据,数据是从数据库中导入到文件中。
线程组->配置元件->CSV Data Set Config
如果Filename中只写了文件名,则需要把文件放到Jmeter的bin目录下。
如果文件中有多列,用符号分隔,需要在Delimiter中添写相关的符号。在Variable Names中也需要填写多个变量名,中间用","分隔,会每次取一行数据
Ignore First Line,是否忽略第一行
Allow quoted data,是否允许带引号
Recycle on EOF,遇到文件结束后是否循环
Stop thread on EOF,遇到文件结束符停止线程
Sharing Mode,是否所有线程组生效,还是只在当前线程组生效
- All Threads,所有线程组
- Current Thread Group,当前线程组
关联
关联:调用第一个接口,从第一个接口中返回的数据中取到某个值,放到第二个接口中使用
HTTP请求->后置处理器->JSON PATH EXTRACTOR
登录接口返回为如下:
{ "error_code": 0, "login_info": { "login_time": "20190416115043", "sign": "96b4de24614f0796402c54f889e50147", "userId": 9786 } }
我们需要取到login_info中的sign,将sign的值放到充值接口中用作cookie值。写法为$.login_info.sign,其中$代表最外层的{},一层一层往内取。
将取到的sign放到充值接口的cookie中
如果需要查看各类变量中取到的值,可以使用线程组->Sampler->Debug Sampler查看各变量所对应的值。
JMeter压测
Jmeter压测
- 分布式压测
- linux下运行
- 10-15分钟
- 稳定性测试,2天或一周左右
在线程组中设置线程数及压测的持续时长,如果要进行长时间压测,需要勾选"永远",以及勾选调度器,并填写持续时间
填写了持续时间后,结束时间会失效
填写了启动延持后,启动时间会失效
Ramp-Up Period,线程在多少秒内会启动完,0为所有线程全部同时启动。一般为1即可。
TPS,服务器每秒钟能处理的请求数
响应时间,请求从发出后与接收到服务器返回给数据所花时间
聚合报告
Samples,发出的请求数
Average,平均响应时间,单位为毫秒
Throughput,TPS
Error%,错误率,不同业务要求不一样,像银行业务要求100%的正确率。
断言,用于校验结果
JMeter操作数据库
测试计划->Add directory or jar to classpath
线程组->配置单元->JDBC Connection Configuration
填写Variable Name
填写Databse URL,jdbc:mysql://192.168.1.116:3307/bugfree?characterEncoding=UTF-8&allowMultiQueries=true
添加JDBC Request,在Variable Name中需要填写JDBC连接配置中填写的变量名
JDBC请求中,Query Type为Callable Statement时,可以同时执行查询和更新语句。
JMeter分布式压测
- 有多台电脑,每台电脑上都有jmeter,且这几台电脑能相互PING通
控制机修改本地Jmeter中jmeter.properties中remote_hosts项,添加负载机ip和端口,
- remote_hosts=192.168.177.128:1099
- 如果需要控制机也发送压力的话,可以在remote_hosts中加班localhost:1099
在负载机上修改jmeter.properties文件,(如果负载机为Windows,不需要修改rmi的两项)
- server_port=1099
- client.rmi.localport=0
- server.rmi.port=1099
负载机上运行jmeter-server.bat
- 如果负载机为Linux,需要关闭防火墙
- ./jmeter-server -Djava.rmi.server.hostname=xxx.xxx.xxx.xxx(负载机本机IP)
- 如果控制机也发送压力,同样需要运行jmeter-sever.jbat
- 如果有参数化文件,需要在其它负载机的同样位置放置一份。
- 控制机,运行->远程全部启动
负载机压测时,控制机的查看结果树中响应结果内容会为空,需要添加断言,用以判断返回结果是否正确。
Linux下NO GUI非图形化方式运行Jmeter
- 把Jmeter的bin目录加入到环境变量(不加环境变量则需要到Jmter目录下运行jmeter命令)
- 把在windows上制作好的jmeter脚本放到Linux上
- 如果有参数化文件,需要把参数化文件放到jmeter的bin目录中
- 运行jmeter -n -t /路径/脚本名.jmx -l 结果.jtl
-n 非图形化界面运行
-t 指定测试脚本
-l 指定结果文件,以.jtl结尾 - 生成.jtl文件后,下载到windows上
- 打开jmeter,添加查看结果树,在结果树中打开.jtl文件