接口测试

前端

  • 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等。请求体中传的是具体的数据。

  1. GET请求只有请求头,没有请求体。它的数据直接放在url中。POST请求放在body中。
  2. GET请求有长度限制,POST请求没有长度限制。
  3. 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

  1. 把Jmeter的bin目录加入到环境变量(不加环境变量则需要到Jmter目录下运行jmeter命令)
  2. 把在windows上制作好的jmeter脚本放到Linux上
  3. 如果有参数化文件,需要把参数化文件放到jmeter的bin目录中
  4. 运行jmeter -n -t /路径/脚本名.jmx -l 结果.jtl
    -n 非图形化界面运行
    -t 指定测试脚本
    -l 指定结果文件,以.jtl结尾
  5. 生成.jtl文件后,下载到windows上
  6. 打开jmeter,添加查看结果树,在结果树中打开.jtl文件

接口测试

相关推荐