使用 Postman 的 CLI 工具进行 API 测试:newman
结论
我需要一个工具来正确处理部署后测试
我有一个项目,部署后测试做得不太好。这个问题一直在待解决清单上,目前我还比较满意,因为已经完成了发布前测试、手动发布测试和发布后监控,但这个问题确实需要解决。
我在 getpostman.com 上偶然发现了newman
cli 工具。它是一个 CLI 开源工具,可以运行你保存在 Postman 集合中的测试,并提供任何现代测试工具所期望的典型错误状态输出/控制台输出,这意味着你可以将其集成到你的 CI/CD 工作流程中。
对于没用过 Postman 的人来说,它是一款非常棒的工具,可以用来向服务发起请求、保存连接集合等等。如果你从事几乎所有基于 Web 的开发工作,它都是你的必备工具。如果你比较老派,喜欢用 cURL 做所有事情?没问题,它可以帮你导入和导出 cURL 命令。快去试试吧。

对我来说唯一的问题是——我不太会用 Postman。我其实不怎么保存东西,只是偶尔用它来测试一下或者快速调试一下。我们有一个围绕我们所依赖的 OpenAPI 规范构建的集成测试集合,所以我不需要像其他人那样创建大量的 API 端点集合。
这里的诀窍是将重复保持在最低限度。
开始:我们需要一个 API 来测试:
我已经存储了这个项目的所有内容,您可以在 GitHub 上看到所有文件
// src/index.js
const express = require('express')
const bodyParser = require('body-parser')
const addRequestId = require('express-request-id')
const app = express();
app.use(addRequestId())
app.use(bodyParser.json())
app.get('/', (req, res) => {
res.json({message: 'hello world', requestId: req.id});
})
app.get('/foo', ({ id, query }, res, next) => {
const { bar } = query
res.json( { bar: `${bar}`, requestId: id })
})
app.post('/foo', ({ id, body }, res, next) => {
const { bar } = body
if (typeof bar === 'undefined' ) {
return res
.status(400)
.json({ error: 'missing `bar`', requestId: id})
}
res.json( { bar: `${bar}`, requestId: id } )
})
const server = app.listen(8081, function () {
const port = server.address().port
console.log("Example app listening to port %s", port)
})
所以,我们有三个端点可以使用:/
as/foo
和as 。端点中有一些验证。我添加了它并将其添加到响应中GET
,以确保它们是唯一的。/foo
POST
POST /foo
express-request-id
开始收藏
我一边写博客一边学习,所以如有回溯,请多包涵!我已经进入 Postman 并创建了一个名为 的新合集postman-newman-testing
。

我仔细创建并保存了三个端点的请求,并为每个端点添加了一些描述:
添加一些测试:
记住,这里的目标是创建一些可以帮助我们运行部署后测试的东西,所以我们将为每个端点在集合中定义一些简单的测试。我想确保:
- 我收到
requestId
每个回复 - 我收到了
200
每个回复 500
当我预期出现错误时,我可以触发响应POST /foo
和GET /foo
端点的预期值返回
正如您所期望的,测试脚本的文档全部位于Postman 学习中心,幸运的是,对于以前使用过测试和 JS 的人来说,它非常熟悉。
因此,经过一些尝试后,我发现了一些很酷的东西;当你进行测试时,每次执行该请求时都会执行它们,因此如果您使用 Postman 进行开发,您就不会“忘记”运行测试。

变体
我想测试一个端点的两个不同输出:成功和失败,但我觉得没必要保存两个不同的请求来实现这一点。那么,我们该如何测试这个POST /foo
端点呢?等我理解得更透彻后,我会再回过头来讨论这个问题。
自动化一切
我已经为我的集合设置了所有快乐路径测试,如果打开 Collection Runner 并运行我的集合(..),那么我会看到一个漂亮的绿色方框板,告诉我我的 API 在非常基本的层面上正在做我期望它做的事情。
我们来锻炼吧newman
。
我已经从 Postman 导出了集合并将其存储docs/postman-collection.json
在项目根目录中,安装了newman
($ npm install --save-dev newman
),然后运行命令来运行测试:
这真是太神奇了,我做了一些简单的 API 测试,但这对我没有任何好处,原因很简单,在我的集合中,我的所有 URL 都设置为http://localhost:8081
,所以我需要想办法改变它。
经过一番点击和谷歌搜索,我们终于可以做到了。Postman 支持环境设置——你可以在主窗口的右上角看到它们。我创建了几个环境(“开发”和“暂存”),并在host
它们中分别用http://localhost:8081
fordevelopment
和https://api.mydomain.com:3000
forstaging
环境创建了一个名为的值。这些操作有点繁琐,就像 Postman 用户界面的其他部分一样,但还是可以实现的 ;)
接下来,我们进入集合并更改已保存请求中的主机名以使用{{host}}
- 该{{ }}
方法是 Postman 处理环境变量的方式,可以用于 API 密钥之类的东西。
那么让我们将其转化为newman
工具。
啊,好的。
因此,导出 Collection 不会带走任何环境变量。我们必须将它们也导出。
现在,我们将要在newman
执行中使用这些环境配置:
轰!Git 控制,命令行执行,在不同环境中测试 API,使用所有开发人员都应该使用的工具进行简单的部署后检查。将其添加到 Jenkins/Gitlab/其他管道中有一些显而易见的步骤,这里就不赘述了,但我对过去几个小时的发现感到很满意。
最后一件事,让我们将其放入package.json
文件中,以便我们可以重复使用:
{
"name": "postman-newman-testing",
"version": "1.0.0",
"description": "",
"main": "index.js",
"config": {
"environment": "development"
},
"scripts": {
"debug": "nodemon src/index.js",
"start": "node src/index.js",
"test": "echo \"Error: no test specified\" && exit 1",
"test-post-deploy": "newman run ./docs/postman-collection.json -e ./docs/$npm_package_config_environment.postman_environment.json"
},
"author": "Chris Williams <chris@imnotplayinganymore.com>",
"license": "ISC",
"dependencies": {
"body-parser": "^1.19.0",
"express": "^4.17.1",
"express-request-id": "^1.4.1"
},
"devDependencies": {
"newman": "^4.5.5",
"nodemon": "^1.19.3"
}
}
然后我们可以根据需要处理环境配置,然后运行
npm run test-post-deploy
执行测试!
结论
虽然它可能是另一组需要维护的测试和定义(我真的希望它基于我们的 OpenAPI 规范文档,但我稍后会弄清楚),但这似乎是实现两件事的好方法:
- 一组非常简单的测试,用于部署后运行或作为监控工具的一部分
- 可以将收集文件分发给使用 API 的开发人员:他们无论如何都会使用 Postman(可能),所以让他们领先一步。
Postman 只是你在进行 Web 开发或应用开发时必须使用的工具之一。鉴于它只是开发工具包的一部分,我们不妨利用它熟悉的功能,将其也用作测试工具的一部分。
我想要进一步了解以下一些事情:
- 也许可以将输出存储在文件中,以便在 Jenkins 中快速查看
- 设置单个测试的严重程度 - 因此,如果我们失败了某些测试,就会立即回滚,如果我们失败了其他测试,就会在工程办公室发出响亮的喇叭声,要求有人调查,但可以通过修复前进来解决问题
- 测试 sad-paths ,确保返回正确的错误响应代码,而无需为它们创建响应:我认为您可以使用 Collection Runner 和示例数据文件来做一些事情,然后标记测试应该是红色还是绿色,但我没有做到这一点。
还要感谢那些在过去几个小时里回复我关于 Postman 的所有推文的人,特别是Danny Dainton ,他在https://dev.to/dannydainton上也有自己的 Dev.to 文章
再次感谢你对之前文章的评论,我很想听听你是如何在你的项目中运用这些技巧的!关注我:https://twitter.com/Scampiuk
鏂囩珷鏉ユ簮锛�https://dev.to/scampiuk/using-postman-s-cli-tool-for-api-testing-newman-5fn1