Panda-api后端接口测试

这个功能还在开发中,欢迎参与讨论和设计

什么是接口测试?

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提交的数据为usernamepassword两个字符串,response中有codemsgtoken, 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可以通过命令行或者在线文档的方式完成单个接口 、一个接口文档或者整个系统的接口的测试。

mock模糊测试任务

根据请求的bodyqueryform_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中,devpro表示这个服务器调用的key,可以让我们很方便的在线或者命令行下切换要测试服务器。devpro里面的值就是具体的服务器的信息。

运行测试

你可以访问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

如果进行所有接口的一次测试,需要进行authtoken接口获取配置,以及配置好接口测试的顺序;

auth 的配置

测试顺序的配置

相关函数

使用Panda Api自身的函数

在和后端接口交互的时候,通常会用到一些函数,比如需要把请求参数按照规则 进行签名加密等第三方函数。这些功能函数在很多接口交互厘米,非常关键。

body: {
    time:{name:"订单时间戳", type:timestamp},
    no: {name:"订单号"},
    product: {name: "商品名称"},
    sign:{name: "签名", value:"$sha256(no={$no}&product={$product}&time={$time})"}
}

调用操作系统本身 或自己写的 功能

支持调用系统本身的命令行,形成功能函数,因为有的时候需要本都证书,usb key之类的,Panda Api函数搞不定,就可以使用命令函数,调用本地程序,取回结果。`

用这个方式,你就可以用pythonrubyjsphp等脚本语言,编写自己的功能函数

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

留言