接口测试

前端

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发送请求
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
接口用例

项目
模块
用例id
用例描述
请求URL
请求方式
请求数据
预期结果
请求报文
返回报文
测试结果
测试人员

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,TPSError%,错误率,不同业务要求不一样,像银行业务要求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文件

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理