接口测试 通过 Postman+Newman+Jenkins 进行接口自动化测试和进一步实现 CI

wolfgao · 2018年12月30日 · 最后由 会飞的尾巴 回复于 2021年04月12日 · 4165 次阅读

相信提到接口测试,大家都知道而且用过 Postman,也认为这是一个非常容易上手的接口测试工具,实际上 Postman 功能非常强大,还有很多部分非常有意思而且实用的功能,我先抛砖引玉,关键是大家一起来探索和一起来分享。比如 Postman 能不能进行自动化接口测试,其实是可以的,而且在如今大家不断提到 TDD 和如何打造 pipeline 上,这方面的需求越来越强烈。

举个简单的真实场景,开发提供了 300 多个 API,每个 API 都有各种参数,所以我们会先在 postman 中为这 300 多个 API 编写 300*n 个 testcase,如果我们都用 postman 跑,其实效率并不高,作为工程师图形化不如命令好使,因此一定要用 newman,既然可以命令行你过来执行为啥不能 CI?

  • 试想,当开发一直在不停的维护这 300 多个接口时,难道需要开发每次都告诉我们测试人员该进行测试了吗?只要通过 Jenkins 来自动执行这些接口测试,基本上 CI 就完成了很多。

  • 如果能够监控到哪些接口发生变动,自动选择相关的 collections,也就是 test suits,就是朝更牛掰的路上又前进了一步。

  • Jenkins 还可以自动发 email 给开发和你,另外也可以自动提交 bug,如果这样的话你就更舒服了,看邮件就可以了。

Postman 部分

这个太简单了,就略过去,百度搜一下,下载安装一个 native 的即可,因为作为 Chrome 插件已经不支持了。我们直接进入正题。

Collection 或者说测试集的建立

在 Postman 中,Collection 类似文件夹,可以把同一个项目的请求放在一个 Collection 里方便管理和分享,Collection 里面也可以再建文件夹。如果做 API 文档的话,可以每个 API 对应一条请求,如果要把各种输入都测到的话,就需要每条测试一条请求了。

在 Postman 里面可以将 Collection 导出存为 json 文件,有了这个文件,就可以通过 Postman CLI 完成命令行执行,实现自动化测试。

  • 导入:用于导入你或团队保存的 API 请求文件,json 格式。

  • 新建文件夹:用于 API 请求划分类别,便于管理。

  • 保存请求:保存你的 API 请求,返回值也能存储下来。

  • 下载:下载你测试通过的 API 请求,团队共享,导入。json 格式,可手动编辑的

Postman 允许用户发送任何类型的 HTTP 请求,例如 GET,POST,HEAD,PUT、DELETE 等,并且可以允许任意的参数和 Headers。

她支持不同的认证机制,包括 Basic Auth,Digest Auth,OAuth 1.0,OAuth 2.0 等。

她还可以响应数据是自动按照语法格式高亮的,包括 HTML,JSON 和 XML。

关于 OAuth2.0,可以看一下这哥们的文章 阮一峰的理解 OAuth 2.0。如果你比较强,建议直接看 RFC 6749,好比直接看原著,也许更适合你 。

  • 可以通过"Capture API request with Postman"来录制测试用例,这个方法也不错,大家可以试一下。

Postman 使用详解

  • 请求 request

  postman 界面分为两部分:左边的 sidebar 右边的 request builder:快速创建几乎所有的 HTTP 请求:URL,请求的 method,headers,body。

  • 响应 responses

保证 API 响应的正确性,就是你需要做的大部分工作。postman 的 response viewer 部分会协助你完成该工作且使其变得简单。

  一个 API 的响应包含 body,headers,响应状态码。postman 将 body 和 headers 放在不同的 tabs 中。响应码和响应时间显示在 tabs 的旁边。将鼠标悬停在响应码上面可以查看更详细的信息。

  • 写断言测试

Postman 的 Tests 标签可以用来写断言测试,提供了大量的 API,非常方便实用。

  • 运行 Collections

postman 允许你运行 collection,其实就是我们在测试领域所说的 test suit,可以配置运行任意的次数。 最后会给出一个整体运行的结果。会保存每一次运行的结果,提供给你比较每一次运行解雇的不同。

  选择 collection,选择环境。点击运行按钮。

测试工具

测试工具主要包括三部分,在发起请求之前运行的 Pre-request,在收到应答之后运行的 Test,和一次运行所有请求的 Collection Runner

  • Pre-request

Pre-request 和 Test 用的语言都是 JavaScript,Postman 在一个沙盒里执行代码,提供给用户的库和函数可以在 这里 查看。而 常用的功能都可以通过右边的 Code Snippets 实现,点击就可以插入到代码区域

可以看到 Pre-request 里常用的功能就两种,设置环境变量和设置全局变量。这条请求的 pre-request 就是在注册之前生成一个字符串作为随机用户名。

postman.setEnvironmentVariable("random_username", ("0000" + (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4));

其他用法还包括在发起请求之前获取当前的时间戳放在参数里:

postman.setEnvironmentVariable("unixtime_now", Math.round(new Date().getTime()/1000));

当然也可以用来生成校验串。总之,在发请求之前需要手动修改的东西,都可以考虑用脚本自动实现。

  • Test

和 Pre-request 相比,Test 的 Snippets 就丰富多了,例如检查状态码、检查响应串、验证 JSON、检查 header、限制应答时间。

如果需要将服务器响应的数据保存下来,用在后面的请求里,也需要在这一步做。

在图中的 Test 里,我首先检查了状态码为 200,然后解析返回的 JSON,把环境变量里的 token 设为 JSON 里的 token。

  • Collection Runner

当编写了很多测试之后,就可以使用 Collection Runner 来自动运行整个 Collection 了,入口就在主界面最上面一行的 Runner 选好 Collection、Environment,如果有需要还可以载入 JSON 和 CSV 作为数据源。点击 Start Test Run ,就可以看到结果了。

mock server

Postman 支持 Mock server 其实也很重要,无论对前端开发还是后端测试,比较不同服务器之间接口很多,大家开发进度不一,另外可以做到环境隔离。
Postman 通过添加examples来实现前端/后端/测试达成的接口协议,这样大家就可以分工并行干活,原文如下。

This behavior allows teams to mock an example request and response, in addition to simulating the endpoint using mock servers. Front-end and back-end developers and testers can all begin working in parallel, based on the agreed-upon example.

当然还有还多 mock 框架,我这里推荐大家一个很方便的 mock 框架就是 moco,已经在github 上开源了
还有一个mock server稍微复杂些,但是也很好使。

Newman 的安装和使用

### 通过 npm 安装
如果要全局安装:

npm install -g newman 

newman 的使用

在 npm 的网站可以找到newman 的专页,非常详细的说明.

  • 支持本地 json 文件作为参数来运行

json 文件可以从 Postman 导出,选定某个 collection,你可以轻易的导出你的 Postman Collection 另外存储为一个 json 文件,然后放到你本地目录进行运行。

$ newman run examples/sample-collection.json

  • 也支持通过 url 作为参数来运行

如果已经有 CI 平台,可以把这些 Collection 放到某个服务器上,newman cli 也支持通过 url 来运行。

$ newman run https:or http: your json url

  • 还有一种就是把 newman 作为 Node.js 的一个 module 来调用,这样更适合大型项目,请参见官方示例代码。
 const newman = require('newman'); // require newman in your project

// call newman.run to pass `options` object and wait for callback

newman.run({

    collection: require('./sample-collection.json'),

    reporters: 'cli'

}, function (err) {

    if (err) { throw err; }

    console.log('collection run complete!');

});

  • 如果还需要更过命令或者帮助,可以通过下面命令获得。
 $newman -h, --help

$newman run -h

对 SSL 的支持 newman 第三版以后(目前已经是 4.3.1)可以支持通过 CLI 选项来支持 SSL

--ssl-client-cert path_to_public_cert_file

--ssl-client-key path_to_private_client_key

--ssl-client-passphrase the_secret_passphrase

对 newman 配置代理:通过对 Postman 的 request 环境变量进行设置来完成代理的配置。

HTTP_PROXY / http_proxy

HTTPS_PROXY / https_proxy

NO_PROXY / no_proxy

如何完成 postman 的 request 设置,请参见postman-request github 的工程 readme

用 newman 的 reporter 功能
newman 集成和支持下面几种报告方式: cli, json, junit, progress and emojitrain.

CLI 是默认选项支持的,其他选项需要你显示在后面写上,比如:

$ newman run examples/sample-collection.json -r cli,json

Jenkins 部分

Jenkins 的安装和配置可以查询相关文档,如果没有配置 master-slave 多级架构,很好搭建,此处略过。

完成 Jenkins 搭建后,开始创建 job 来执行 newman 命令,确保你的 newman 命令在 Jenkins 服务器上是可执行的,比如将路径放到 PATH 里面,先执行一下

newman -v

  • 选择一个自由风格的 job

  • 可以选择定期执行,这部分可以网上搜一下如何定期执行一个 job,一般来说就是 5 行数据,根据你的需要。比如我要每 10 分钟执行一下,就这么写 “H/10 * * * *“。

这部分也可以通过监控代码提交来 trigger,我只是举个例子。

  • 在执行 shell 的部分添加你的 shell 命令,其实也就是你 newman 命令

这里需要主线的是,你的 json 文件是放在那里,前面已经说过可以放到内部服务器,给个 url,newman 也是支持的,也可以放到 Jenkins 的服务器上。

  • 其他邮件配置或者如何自动提交 bug,也比较 normal,请自行突破,相信只有自己突破了才有更大的收获感。

不足之处:

API 接口不能太多,不要超过 300 个,太多通过这个方式还是很麻烦,至少维护 json 文件比较累。

不能支持并发操作,只能用于功能测试和压测。

总之这个自动化接口测试架构,而且带有 CI 的框架还是比较适合以 API 接口为主的测试,非常容易上手和熟悉,也非常容易维护,希望能真的帮助你。

最好,感谢你读完此文章,为了节省时间我这里没有提供大量的截图,实在抱歉,如果确实需要我回头再补上,也希望大家有任何反馈意见直接回复,2019 年我们一起进步!!!

共收到 3 条回复 时间 点赞

支持一波。
在 newman 生成报告方面有没有新探索?
自带的 html 报告样式太丑,生成的 xml 没法直接使用 Jenkins 上面的 Junit 报告插件处理~

EthanYin 回复

如果觉得自带的报告很丑,可能需要二次开发,或者再找找有没有好一点的开源项目,最好是结合自己的平台统一考虑,现在 TesterHome 又一个自动化测试开源项目可以关注,还有一个开源项目 HttpRunner 也可以关注。

EthanYin 回复

可以去看 Newman 的报告插件 https://www.npmjs.com/search?q=newman-reporter
htmlextra 这个报告插件不错,allure 的插件好像有乱码

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