BDD API 自动化测试 01: 使用库函数模拟发送请求

imzack · 2018年10月12日 · 1060 次阅读

本文介绍了如何使用 Node.js 的常用库发送 RESTful 的 API 调用。用 CNode 社区的 API 举例说明如何发送 get 和 post 请求。

  • Http 请求方法
  • url 简要说明
  • get 请求
  • post 请求

url 简要说明

我们知道,浏览器访问的 URL 通过 HTTP 访问网站,HTTP 的方法可以是 get 或 post, 比如我们在使用搜索引擎搜索网络内容时,以 bing 搜索为例,当在搜索框中输入一个关键字如 CukeTest 进行搜索时,会发送如下的 get 请求:https://cn.bing.com/search?q=CukeTest&qs=n&form=QBLH&sp=-1&pq=cuketest&sc=0-8&sk=&cvid=15A4BA327CB143A38EFA87594735E7F0

这个 URL 中前面https://cn.bing.com/search 为请求路径。其余部分为请求参数。简单总结下,在完整的 URL 中,以 ? 为分隔,? 之前的部分为请求路径,后面部分为请求参数。多个请求参数以 & 符号连接,参数名与参数的值以 = 连接。

get 请求

RESTful api 也是发送 HTTP 请求,它的 get 请求通常用来检索信息。以 Node.js 著名的社区 CNode 社区为例,它提供 API 直接访问 CNode 社区的数据。地址为https://cnodejs.org/apiCNode 社区的源码(https://github.com/cnodejs/nodeclub/)部署在自己的测试环境。在 CNode 的 api 说明中,可以看到第一个为 get 请求:,或者可以将

get /topics 主题首页
接收 get 参数

page Number 页数
tab String 主题分类。目前有 ask share job good
limit Number 每一页的主题数量
mdrender String 当为 false 时,不渲染。默认为 true,渲染出现的所有 markdown 格式文本。

查询主题首页的数据,根据这个 api 说明文档,我们可以直接在浏览器中访问 https://cnodejs.org/api/v1/topics ,它返回首页主题的数据。如果要一些限定条件,比如限制每一页的主题数量为 1,则可以加上 limit 参数,请求路径为 https://cnodejs.org/api/v1/topics?limit=1 再添加参数的话,后面使用 & 连接起来,如果再限定下页数为 1,请求路径即为https://cnodejs.org/api/v1/topics?limit=1&page=1,浏览器中直接访问此链接即可。

post 请求

post 请求是向指定的资源提交要被处理的数据。post 请求与 get 请求不同的是,post 请求的参数是在 body 中存放。比如,常用的登录操作就是用 post 方法向服务器传送数据。

使用 got 库发送请求

"got"是一个流行且语法好用的模拟发送 http 请求的 npm 库。安装方式简单,安装完 Node.js 之后,在项目目录下直接执行 npm install got --save ,即可完成安装。

发送 get 请求

上面我们介绍了 api 测试中常见的 get 请求,可以直接在浏览器中进行对 get 请求的验证。下面演示下在如何使用 got 库进行 get 请求。

我们参考了 cnodejs.org 社区的 API 来进行说明 https://cnodejs.org/api
以首页主题为例,代码如下:

let got = require('got');

async function sendGet() {
    // got 默认调用get请求方法
    let res= await got('https://cnodejs.org/api/v1/topics?limit=1');
    console.log(res.body);
}

sendGet();

为 get 请求添加断言

使用 got 库可以很方便发送 get 请求,但是在自动化测试中,我们还需要针对服务器相应的数据进行判断,如上面的请求中,验证的数据如下表:

状态码 :200
返回结果数据长度 :1

同时可以使用 node.js 自带的 assert 库来进行判断:

let got = require('got');
let assert = require('assert');
async function sendGet() {
    let res= await got('https://cnodejs.org/api/v1/topics?limit=1');
    // console.log(res.body)
    // 将返回结果解析为JSON对象
    let result = JSON.parse(res.body);
    // 判断状态码
    assert.equal(200,res.statusCode);
    // 判断返回的帖子长度是否为1
    assert.equal(1,result['data'].length);

}

sendGet();

got 库模拟 post 请求

以 CNode 社区的 "创建主题 " api 为例:

根据 api 文档,我们知道返回数据 success 字段为 true,可以添加验证,代码如下:

let got = require('got');
let assert = require('assert');
async function  sendPost () {
    // 请求方法体
    let bodydata = {
        accesstoken:"xxx自己注册账号的tokenxxx",
        tab:'dev',
        title:'hello,world!',
        content:'this is a test topic'
    }
    let result = await got.post('https://cnodejs.org/api/v1/topics',{
       // 设置数据类型为JSON 数据类型
        json:true,
        body:bodydata    })
    console.log(result.body)
    let result_data = result.body;
    assert.equal(true,result_data['success']);
}

sendPost();

为方便 node.js 开发,可以使用易用性较高的 vscode 或 CukeTest(http://cuketest.com)。

总结

使用 got 库很方便的模拟 http 的请求,通过 nodejs 自带的断言,可以对数据结果进行判断,下一步只需要把这些操作库集成到框架中,就能快速完成 api 的自动化测试。

更多关于 got 库的使用可以参考 got 文档:https://www.npmjs.com/package/gotgot 库来模拟 http 请求,也可以使用 nodejs 其它库,比如:axios,request 等其它库。。另外除了可以使用

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册