乐趣区

接口测试

前端

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 文件

退出移动版