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

相信提到接口测试,大家都知道而且用过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](http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html)。如果你比较强,建议直接看 [RFC 6749](http://www.rfcreader.com/#rfc6749),好比直接看原著,也许更适合你 。

- 可以通过"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,这部分其实也很重要,无论对前端开发还是后端测试,比较不同服务器之间接口很多,大家开发进度不一,另外可以做到环境隔离。

当然还有还多mock 框架,我这里推荐大家一个很方便的mock框架就是moco,已经在[github上开源了](https://github.com/dreamhead/moco)。

还有一个[mock server](http://www.mock-server.com/)稍微复杂些,但是也很好使。

Newman的安装和使用

通过npm安装

如果要全局安装:

`npm install -g newman `

newman的使用

在npm的网站可以找到[newman的专页](https://www.npmjs.com/package/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](https://github.com/postmanlabs/postman-request)

用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年我们一起进步!!!