这个功能还在开发中,欢迎参与讨论和设计
API接口测试是一种作为集成测试的一部分,通过直接控制被测应用的接口(API)来确定是否在功能、业务逻辑、可靠性、性能和安全方面达到预期的软件测试活动。由于 API 都没有 GUI 界面,API 测试都是在通讯层进行的。现在 API 测试在自动化测试中有着很重要的地位,因为 API 一般是应用逻辑的主要接口,同时 GUI 测试在敏捷开发和 DevOps 的快速迭代和频繁变更中很难维护。
API接口的正确性测试很重要,单独只从前端验证,远远不够,绕过前端太容易了,还需要从接口层面进行验证接口是否正确运行。
我们的程序运行正确 意思的就是:代码按我们期望的那样运行
所以首先要明确我们的期望是什么? 明确期望并定义在接口设计文档中。Panda Api本身就是接口文档设计工具,定义好前后端的接口约定,也就是我们期望后端接口按这样的方式返回结果。
程序运行正确是一个很难证明的事情,后端程序的开发、运行,对于前端来说是一个黑箱。虽然我们的后端程序员经验丰富、能力高强,但并不能保证考虑到所有情况,完全按照约定返回值,不放任何一点错误。为此,Panda Aai天然包含了对后端接口测试的功能。
例如,我们之前的例子中用户登录接口的部分,这里我们为了例子,稍微完善一些这个接口的设计:
...
method: "POST",
url:"/login/",
body_mode:"json",
body:{
username:{name:"用户名", type:"string", min_length:3, max_length:30},
password:{name:"用户登录密码", min_length:6, max_length:30}
},
response:{
code:{name:"返回结果的代码", type:"int", desc:"登录成功只返回1", $enum:[[-1, "失败"], [1, "成功"]]},
msg:{name:"登录成功返回消息", type:"csentence", desc:"通常返回都是空"},
token:{name:"登录成功返回的用户token", type:"string", required:false, length:60}
},
test_data:[
{
body:{username:"edison", password:"123"},
response:{code:-1, msg:"密码输入不正确"}
},
{
body:{username:"lily", password:"123"},
response:{code:-2, msg:"用户名不存在"}
},
{
body:{username:"root", password:"123"},
response:{code:1, msg:"登录成功", token:{$mock:true, required:true}}
},
{
body:{username:"lily"},
response:{code:-1, msg:"密码是必填的"}
},
{
body:{password:"123"},
response:{code:-1, msg:"用户名是必填的"}
}
]
...
我们可以立即执行一次对Panda Api提供的接口测试:(这里假设panda运行在默认的9000端口,如果不是要自己进行修改)
// 对接口 /login/进行测试
panda test --server-url http://localhost:9000 -u /login/
request body: Object({"password": String("123"), "username": String("edison")})
response Object({"code": Number(-1), "msg": String("密码输入不正确")})
request body: Object({"password": String("123"), "username": String("lily")})
response Object({"code": Number(-2), "msg": String("用户名不存在")})
request body: Object({"password": String("123"), "username": String("root")})
response Object({"code": Number(1), "msg": String("登录成功"), "token": String("NQtS)ngBz6p49pHBR#rGyklw5KlRWihCCUVYce!IgIyBXHA5Q$KMzV!A*6ql")})
request body: Object({"username": String("lily")})
response Object({"code": Number(-1), "msg": String("密码是必填的")})
request body: Object({"password": String("123")})
response Object({"code": Number(-1), "msg": String("用户名是必填的")})
从输出日志可以看到,Panda Api的测试工具自动把test_data
里面的数据一条一条的对接口进行了请求,获取返回数据,并打印了出来,如果我们指定的是开发服务器,或者测试服务器,这样一条命令就完成了传统我们需要手工一条一条的操作。
我们已经在设计了用户登录的接口文档,文档中约定了请求地址/login/
、请求方法POST
以及数据提交的格式,约定了我们body
提交的数据为username
和password
两个字符串,response
中有code
、msg
和token
, Panda Api首先会用test_data
里面的数据去请求我们指定开发环境的服务器,把test_data
里面的数据body
请求,看返回是不是我们期望的response
,如果不是,会有响应的错误信息提示出来。然后Panda Api会按照body
字段的约定,自动mock数据进行各种数据对接口进行合法数据和不合法数据的检查。例如,请求body
数据{username:"edison", password:"123"}
,返回的是不是:{code:-1, msg:"密码输入不正确"}
,请求username
长度大于30或者小于3,返回数据是不是response
中的约定。
由此可见,如果我们的请求参数的body
相关文档信息写的越详细,越清晰,我们浏览文档会获得更准确的信息,让开发更明确,也会让测试的质量变更好。
test_data
主要是给前端做模拟后端数据返回的,有的时候我们后端数据和前端会不一样,我们可以写到后端专属的测试数据test_case
。
只要运行期后端接口测试服务,Panda Api就会持续去请求各个接口,监听接口是否按约定返回。无论何时后端对代码进行修改,都可以运行测试来确保接口是否正确。
Panda Api可以通过命令行或者在线文档的方式完成单个接口 、一个接口文档或者整个系统的接口的测试。
根据请求的body
、query
、form_data
等模拟各种请求数据,以及header
,完成随机模糊测试任务。
mock测试中包含了 数据的边界内测试和边界外测试
进行mock模糊测试的是时候,Panda Api是根据 response
定义的规则,去校验请求返回值是否满足这个规则,来验证返回结果是否正确。
首先,我们需要配置需要测试服务的相关信息,编辑_settings.json5
,增加servers
信息
// _settings.json5
{
project_name: "Panda Api",
project_desc: "Panda Api is a simple api manage tool",
global: {
apis: {
auth:true
}
},
servers:{
dev:{
name:"开发服务器",
desc:"",
url:"http://127.0.0.1:9000",
},
pro:{
name:"正式服务器",
url:"http://www.b.com",
}
}
}
配置servers
中,dev
和pro
表示这个服务器调用的key
,可以让我们很方便的在线或者命令行下切换要测试服务器。dev
和pro
里面的值就是具体的服务器的信息。
name
表示服务器环境名称;desc
表示备注,可以不要,默认为空;url
表示服务器的请求地址,如果有端口,也要写到里面 你可以访问http://localhost:9000
访问在线文档,然后在对应接口文档的地方进行测试,也可以在命令行下进行测试。命令行下你可以对整个系统进行测试以及自动化测试。
以下是Panda Api 在命令行下执行测试的相关用例,更多执行panda test –help
查看:
# 测试dev服务器 单个接口
panda test -s dev -u /login/
# 测试dev服务器 单个文档接口
panda test -s dev -d auth.json5
# 测试dev服务器 多个文档的接口
panda test -s dev -d auth.json5 article.json5
# 测试dev服务器 所有接口
panda test -s dev -A
# 测试dev服务器 单个接口 并监听 默认每5分钟进行1次测试
panda test -s dev -u /login/ -c
# 测试dev服务器 单个接口 并监听 每10分钟进行1次测试
panda test -s dev -u /login/ -c 10
# 测试dev服务器 单个文档接口 并监听 默认每5分钟进行1次测试
panda test -s dev -d auth.json5 -c
# 测试dev服务器 多个文档的接口 并监听 默认每5分钟进行1次测试
panda test -s dev -d auth.json5 article.json5 -c
# 测试dev服务器 所有接口
panda test -s dev -A -c
如果进行所有接口的一次测试,需要进行auth
的token
接口获取配置,以及配置好接口测试的顺序;
在和后端接口交互的时候,通常会用到一些函数,比如需要把请求参数按照规则 进行签名加密等第三方函数。这些功能函数在很多接口交互厘米,非常关键。
body: {
time:{name:"订单时间戳", type:timestamp},
no: {name:"订单号"},
product: {name: "商品名称"},
sign:{name: "签名", value:"$sha256(no={$no}&product={$product}&time={$time})"}
}
支持调用系统本身的命令行,形成功能函数,因为有的时候需要本都证书,usb key之类的,Panda Api函数搞不定,就可以使用命令函数,调用本地程序,取回结果。`
用这个方式,你就可以用python
、ruby
、js
、php
等脚本语言,编写自己的功能函数
body: {
time:{name:"订单时间戳", type:timestamp},
no: {name:"订单号"},
product: {name: "商品名称"},
sign:{name: "签名", value:"$command(./sha256.py no={$no}&product={$product}&time={$time})"}
}
支持调用网络接口,形成功能函数
body: {
time:{name:"订单时间戳", type:timestamp},
no: {name:"订单号"},
product: {name: "商品名称"},
sign:{name: "签名", value:"$request("https://www.debugmyself.com/sha256/", no={$no}&product={$product}&time={$time})"}
}
如何根据业务逻辑来设计用例?比如: 1、登录失败5次,就需要等待15分钟之后再登录 2、新注册的用户需要过了实习期才能发帖 3、删除帖子扣除积分 4、充值金额后,需要审核,余额才会增加 ...
2020-02-16 06:57