欢迎大家来到IT世界,在知识的湖畔探索吧!
前言
在前两篇 文章《接口测试利器Postman – 基础篇》和《接口测试利器Postman – 进阶篇》中,我们介绍了 Postman 作为一款专业接口测试工具在接口测试中的主要用法以及它强大的变量、脚本功能,给测试工作人员完成接口的手工测试带来了极大的便利。其实在自动化测试上,Postman 也能进行良好的支持。本篇我们就一起来了解如何利用 Postman 进行接口自动化测试。
自动化测试概述
在继续本篇内容前,我们还是首先温习一下和自动化测试相关的一些基本概念。 百度百科中给出的定义:
自动化测试就是将人为驱动的测试行为转化为通过机器来执行的一种过程。
人为驱动的测试行为,从广义上理解可以包含从测试需求分析到测试设计、测试执行以及测试总结的全过程,而狭义的理解一般就是将测试设计通过测试代码来体现并通过代码的执行来自动地完成测试的执行并输出执行结果。 现在我们谈到自动化测试,更多还是在狭义层面,通过自动化测试来提升测试执行效率,通过快速得到测试用例的执行结果来尽快得到被测产品状态,更多是起到质量指示器的作用。
在《接口测试利器Postman – 基础篇》中我们介绍了经典的自动化测试金字塔:
这里根据不同测试类型对软件测试进行了分层:
- 底层是针对的代码层面的单元测试。
- 中间层是 service 服务测试,现代软件的应用服务基本都是以接口 API 形式来体现,服务测试也可以理解就是接口 API 测试。
- 上层则是针对用户界面的测试。
这个模型体现在自动化测试中,表示越底层的自动化测试所占比重应该越大,这样才有更好的投入产出比。而中间这一层的 Service 测试它既不像 UI 层那样维护成本巨大,很难跟得上快速迭代的要求,同时它又比单元测试更能在业务逻辑上进行质量验证。所以现在一般认为 API 测试是自动化测试实施上的优先选择。
借助一些自动化测试工具或者自动化测试框架的帮助,我们可以在测试执行的用例组织、执行策略、测试数据管理、结果报告等方面更加方便地进行自动化测试的实施。下面我们就来看看 Postman 在自动化测试上提供的支持。
Postman的批量执行工具 Runner
Runner 是 Postman 中用于批量执行接口用例的模块,我们可以通过 Runner 模块来完成已编写接口用例的自动化测试执行。
Runner 功能介绍
在 Postman 主界面左上角,点击 Runner 按钮,即可打开 Runner 模块界面。如下图
相关设置的作用如图上标注。选中待执行的 Collection 或 Folder 后,点击运行按钮,会开启如下运行页面,并显示执行结果。相关界面元素含义如图上标注
接口的测试数据驱动
Postman 通过 引入 data 变量来支持 Runner 运行时的测试数据加载和数据驱动。在上一篇 Chat《玩转Postman:进阶篇》中,我们简单介绍了 data 变量的使用方法。这里我们再结合一个 GitHub API 的例子回顾一下:
数据文件中给出一组 Repositories 的信息(测试数据),我们运行一个和这组数据相关的接口:获取 repo、获取 repo 的 contributor、获取 repo 的 tag、获取 repo 的 topic,并分别进行相关校验
Postman 支持两种外部数据类型,json 格式或者 txt/csv 格式。这里我们假设将 repositories 数据以 json 格式保存在数据文件中,给出如下一些主流的开源自动化测试框架
[{
"owner": "junit-team",
"repo": "junit5"
}, {
"owner": "robotframework",
"repo": "robotframework"
},{
"owner": "appium",
"repo": "appium"
},{
"owner": "SeleniumHQ",
"repo": "selenium"
}]
欢迎大家来到IT世界,在知识的湖畔探索吧!
在 Test 脚本中编写校验,在上一讲中我们提到一个技巧,对于重复使用的脚本我们可以把它们保存到 global 变量中,需要时执行这个变量内容即可。本例中我们需要执行的几个接口,都会用到是否正确返回成功响应的校验。 所以可以设置一个 global 变量 checkOK。变量值即需要执行的校验脚本
不同的接口中均包含了相应 repo 信息作为路径参数,然后我们再添加对应的校验
- 获取 repo 接口
/repos/:owner/:repo
欢迎大家来到IT世界,在知识的湖畔探索吧!eval(pm.globals.get("checkOK"));
//判断是否存在 stargazers_count 字段
pm.test("存在 Star 数据",function(){
pm.response.to.have.jsonBody("stargazers_count")
//获取 star 数量
let star = pm.response.json().stargazers_count
// 将Star数显示到Test Result中,并判断是否 超过 1000 Star
pm.test("当前repo【"+ pm.variables.get("repo") +"】star数【"+ star +"】超 1000",function(){
pm.expect(star).to.gt(1000)
})
})
- 获取 Contributor 接口(因接口默认返回数量为 30, 这里用 per_page 参数指定每页返回数量 100)
/repos/:owner/:repo/contributors?per_page=100
eval(pm.globals.get("checkOK"));
//遍历当前返回数组长度
var contributor=0;
for(var c in pm.response.json()){
contributor++;
}
//判断贡献者是否超过5人
pm.test("贡献者数量【" + contributor + "】超过 5 人",function(){
pm.expect(contributor).to.gt(5)
})
- 获取 Tag 接口(因接口默认返回数量为 30, 这里用 per_page 参数指定每页返回数量 100)
/repos/:owner/:repo/tags?per_page=100
欢迎大家来到IT世界,在知识的湖畔探索吧!eval(pm.globals.get("checkOK"));
//遍历当前返回数组长度
var tag=0;
for(var c in pm.response.json()){
tag++;
}
//判断标签是否超过5个
pm.test("tag数量【" + tag + "】超过 5 个",function(){
pm.expect(tag).to.gt(5)
})
- 获取 Topic 接口
/repos/:owner/:repo/topics
eval(pm.globals.get("checkOK"));
//判断返回Topic names,并显示到Test Result
pm.test("当前repo【"+ pm.variables.get("repo") +"】Topic:" + pm.response.json().names,function(){
pm.response.to.have.jsonBody("names")
})
在 Postman 中设置 Runner 配置并运行
结果如图:
从结果中我们可以看到,所有定义在 GithubRepos.json 这个文件中的 Repo 信息均按照上述流程进行了正确的执行。
接口的流程控制
除了这样按顺序的执行,在我们的实际测试工作中,很多情况下还会希望根据接口测试的执行结果来决定后续执行的测试用例,这就是接口的流程控制功能。Postman 的 Runner 模块也可以支持这种流程控制,它是借助 Postman 的脚本封装方法 postman.setNextRequest()来实现的。
比如上面介绍的数据迭代过程,在获取 repo 后,如果成功响应,我们继续执行 GetTag 接口,否则退出。 我们修改 GetRepo 这个接口的 Test 脚本如下:
if(pm.response.code == 200){
postman.setNextRequest("GetTag")
}else{
postman.setNextRequest(null)
}
再修改测试数据,给出一个不存在的 Repo 信息模拟匹配不到返回错误的情况
[{
"owner": "junit-team",
"repo": "junit5"
}, {
"owner": "chengxiaqiucao",
"repo": "errorRepo"
}]
再次重新执行,我们可以看到:
- GetRepo这个接口,返回正常时,跳转到 GetTag 这个接口执行,这里跳过了按正常顺序应该执行的 GetContritutor;
- 而当执行到错误的 Repo, 得到 404 Not Found 响应,此时 Runner 中断了执行
执行结果如图:
注意:
无论 postman.setNextRequest() 方法在脚本的什么位置,它总是在脚本的最后执行跳转操作
postman.setNextRequest() 方法有自己的作用域,当选择 collection 执行时,所选择的 request需要在当前collection中,当选择 Folder 执行时,所选的 request 需要在当前 folder中
命令行自动化工具 NewMan
Newman 是 Postman 官方提供的专门用于自动化测试执行的命令行工具,使 Postman 具备了支持自动化测试扩展以及和第三方系统集成调度的能力。
NewMan 的安装
因为 Newman 基于 Node.js,所以首先要保证机器上具备 Node.js 环境,此处不再另外介绍 Node.js 的安装。 Node 环境具备的话,运行如下命令能正确显示版本号即可
c:\>node --version
v6.9.0
安装 Newman 使用如下命令:
> npm i newman -g
安装完成后检查版本,能正确显示即安装成功
c:\>newman -v
4.3.1
NewMan 功能介绍
Newman 命令行工具的主要命令是 newman run,命令格式如下
> run [options] <collection>
这里的 Collection 可以是从 Postman 中导出的 Collection 文件,也可以是通过 Postman 账号 share 出来的在线 Collection URL 地址。
Collection 从 Postman 中导出方法如下:
此时会提示选择版本,建议选择推荐的Collection 2.1 版本。导出后会保存为一个 json 文件。
下面介绍几个 newman 运行时常用的参数:
- -e, –environment <path>
指定 environment 环境变量,这里环境变量需要导出为文件( json 格式)
- -g, –globals <path>
指定 global 环境变量,这里环境变量需要导出为文件( json 格式)
- -d, –iteration-data <path>
指定运行 Collection 时使用的 data file 文件
- -n, –iteration-count <n>
指定 Collection run 时的迭代次数 n
- -r, –reporters [reporters]
指定运行完成后的结果报告类型,除默认命令行格式 cli外, 还支持 json, junit, progress 以及 emojitrain几种类型。
除了 newman 默认支持的几种报告格式, 我们还可以安装一个 html 格式的报告插件,安装命令如下:
> npm install -g newman-reporter-html
如上例中的 newman 执行命令,此时带上 –reporter html 参数,即可在当前目录的 newman 目录下生成一个 html 格式的报告
>newman run GitHub.postman_collection.json -e GitChat.postman_environment.json --reporters html
报告形如:
我们还可以在这个命令基础上增加–reporter-html-export 参数指定生成的 html 文件路径,命令如下:
>newman run GitHub.postman_collection.json -e GitChat.postman_environment.json --reporters html --reporter-html-export c:\newman\result.html
这样我们就可以在指定目录下得到输出的 HTML 结果报告了。
和持续集成工具 Jenkins 的集成
Jenkins 是目前最为流行的持续集成工具,在研发流程,特别是现今推崇 DevOps 的研发环境下,通过 Jenkins 将自动化测试纳入持续集成管道是其中的一项核心实践。下面我们就来具体看下如何结合 Jenkins 和 Newman 工具来完成持续集成中自动化测试任务的创建和调度执行。
Jenkins 的安装
首先还是看下如何安装 Jenkins。企业中一般由研发配置或支撑部门来维护 Jenkins。这里我们以 window 版本为例看下安装过程
- 首先来到 Jenkins 的官网 https://jenkins.io/ ,进入 download界面,选择长期支持版本,根据操作系统类型选择对应安装包,这里选择 windows 版本
- 完成下载后的到一个 zip 文件,解压后执行 msi 安装文件,一路默认安装即可
- 安装完成后,我们可以来到 windows 系统的服务管理器中,可以看到已经自动创建了一个名为 Jenkins 的服务,会随系统自动运行,我们也可以根据需要改成手动。
- 此时访问 http://localhost:8080,会等待 Jenkins 完成系统部署和初始化
- 初始化完成,会要求输入初始密码,可以根据提示从初始密码文件中获取
- 输入密码后需要进行插件的安装,一般选择推荐配置即可
- 选择插件后,等待相关插件下载并完成安装
- 完成后设置用户名和账号
- 继续下一步,设置访问 URL 和端口,此处使用默认地址
- 重启服务后再访问 Jenkins 服务地址,登录后进入主界面,至此安装完成。
Jenkins 配置 Newman 执行自动化
进入 Jenkins 主页后,我们选择新建 Job,这里选择构建自由风格项目,创建一个新的持续集成任务
点击 OK 后会进入配置页面,来到 Build 配置,选择执行Windows批处理命令, 如果是部署在其他操作系统如 Linux 系统,可以相应的选择执行shell
输入前面我们执行自动化的 newman 命令,注意,因为 Jenkins 调度会从 Jenkins 工作空间目录执行,所以这里指定的 Collection 和 environment 文件需要给出绝对路径
保存后即完成了一个最基本的自动化测试执行 Job 的创建。此时点击右侧的立即构建可立刻触发任务的执行
点击构建编号(此处为 #1),进入构建详情,通过打开右侧Console Output可以查看具体执行的控制台输出
Tips 1: 在本例中,我们可以看到出现了newman 不是内部或外部命令的错误,这是因为 NewMan 安装后,默认是将执行路径添加在当前用户的 Path 用户环境变量下,而通过 Jenkins 执行,没有路径访问权限,所以我们需要将 Newman 所在 npm 目录添加到系统环境变量 Path 中。如图
修改变量后,通过 http://127.0.0.1:8080/restart 地址重启 Jenkins 使变量生效,再次执行构建:
可以看到已经成功调度了自动化测试任务,但是控制台输出中存在乱码。如果你也出现这个问题,可按以下方法解决
Tips 2: 此处乱码是因为 Jenkins 使用的 jvm 环境未设置语言支持。我们同样方法添加如下 windows 系统环境变量,设置后重启 Jenkins 服务,再次执行即可正常看到执行结果了
JAVA_TOOL_OPTIONS = -Dfile.encoding=UTF8
生成测试报告
要在 Jenkins 中展示测试报告,首先我们要生成测试报告。根据上面 NewMan 执行参数的介绍,可以添加相关报告参数–reporters junit,html –reporter-html-export .\newman\result.html来生成。这里同时生成 junit 和 html 两种格式的报告到当前工作目录的 newman 目录下。完整命令如下
newman run c:\GitHub.postman_collection.json -e c:\GitChat.postman_environment.json –reporters junit,html –reporter-html-export .\newman\result.html
而要在 Jenkins 中展示 HTML 报告,我们需要添加一个展示插件, 来到 Jenkins > 系统管理 > 插件管理 界面下,在 Availble 中查询并安装 HTML Publisher插件
重启 Jenkins 后,我们就可以添加相关报告展示配置了。还是来到 Newman_Test这个任务下,配置Post-build Actions,分别添加 Junit 结果报告和 HTML 报告,如下图:
完成报告配置后,我们再运行几次任务,这是在任务界面上就可以看到相关测试结果的报告链接以及执行趋势了(执行趋势为 Junit 报告产生)
如图是 JUnit 报告:
如图是 HTML 报告;
配置任务定时执行
在持续集成中,自动化测试的自动触发是非常重要的,这是在任务配置的 Build Triggers 中进行配置的,如图是配置定时触发的方法。这里的触发计划符合 Linux Crontab 的语法。具体语法可以参照 Jenkins 给出的语法帮助
自动发送测试结果邮件
同样,在持续集成中,及时将测试结果通知到相关人员非常重要。这里需要安装 Jenkins 的邮件通知扩展插件:Email Extension Plugin,同样参照上文插件安装的方法在插件管理界面中完成安装。
要使用邮件通知,需要接收邮箱支持 smtp 服务。以 QQ 邮箱为例,在邮箱账号的设置界面中,开启 SMTP 服务,并生成对应的授权码
回到 Jenkins,安装完插件以后,需要对插件进行配置。来到系统管理 > 系统设置中,首先设置管理员邮箱地址。
在 Extend E-Mail Notification 配置中,如图进行配置,注意点开高级后,这里的用户密码是在 QQ 邮箱中生成的授权码
同样 E-mail Notification 配置中进行类似配置。
完成系统配置后,来到任务配置界面。在配置的最后添加 Post build Action,选择 Editable Email Notification,参见如图进行设置。
保存后,触发构建。可以从 console output 中看到邮件是否有成功发送。发送后进入邮箱即可看到已经收到了对应的结果通知邮件。
附件:结果邮件模板
附上这里使用的邮件模板文件,邮件模板中可以使用 Jenkins 的一些默认变量,如:项目名称 $PROJECT_NAME, 构建编号 $BUILD_NUMBER,构建状态 $BUILD_STATUS 等,大家可以参照模板内容对照看一下,也可以参考 Jenkins 官方给出的一些说明。
<body>
<head>
</head>
<h2 style="color: #5e9ca0; text-align: center;">本邮件是 NewMan 自动化测试邮件,请勿回复!!!</h2>
<table class="editorDemoTable" style="height: 273px;" width="430">
<thead>
<tr>
<td nowrap="nowrap" style="background-color: #3498db; text-align: center;" colspan="2">
<h2><span style="color: #000000;">NewMan 自动化测试执行报告</span></h2>
</td>
</tr>
</thead>
<tbody>
<tr>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #808000;">项目名称:</span></td>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #808000;">$PROJECT_NAME</span></td>
</tr>
<tr>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #808000;">构建编号:</span></td>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #808000;">$BUILD_NUMBER</span></td>
</tr>
<tr>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #808000;">构建状态:</span></td>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #808000;">$BUILD_STATUS</span></td>
</tr>
<tr>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #808000;">触发原因:</span></td>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #808000;">${CAUSE}</span></td>
</tr>
<tr>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #808000;">构建日志地址:</span></td>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #00ccff;"> <a style="color: #00ccff;" title="构建日志" href="${BUILD_URL}console">${BUILD_URL}console</a></span></td>
</tr>
<tr>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #808000;">构建地址:</span></td>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #00ccff;"> <a style="color: #00ccff;" title="构建地址" href="$BUILD_URL">$BUILD_URL</a></span></td>
</tr>
<tr>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #808000;">测试报告地址:</span></td>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #00ccff;"><a style="color: #00ccff;" title="NewMan测试报告地址" href="${BUILD_URL}HTML_20Report/">${BUILD_URL}HTML_20Report/</a></span></td>
</tr>
<tr>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #808000;">Junit测试结果地址:</span></td>
<td nowrap="nowrap" style="border-color: gray;"><span style="color: #00ccff;"> <a style="color: #00ccff;" title="测试结果地址" href="${BUILD_URL}testReport/">${BUILD_URL}testReport/</a></span></td>
</tr>
</tbody>
</table>
</body>
结语及预告
以上就是本篇 Postman 自动化测试相关内容的介绍,再简单总结下,在本篇 Chat 中,我们学习了:
- 通过外部数据文件结合 Runner 模块完成数据驱动的自动化测试执行
- 通过 Postman 的内建方法 postman.setNextRequest() 来控制接口的流程走向
- 命令行工具 Newman 的安装和使用实例
- 持续集成工具 Jenkins 的安装配置以及如何与 newman 结合完成自动化测试脚本的触发,以及结果报告生成和通过邮件模板进行邮件通知。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/36395.html