使用 Postman 的 CLI 工具进行 API 测试:newman 结论

2025-06-10

使用 Postman 的 CLI 工具进行 API 测试:newman

结论

该图片由Steve BuissinnePixabay上发布

我需要一个工具来正确处理部署后测试

我有一个项目,部署后测试做得不太好。这个问题一直在待解决清单上,目前我还比较满意,因为已经完成了发布前测试、手动发布测试和发布后监控,但这个问题确实需要解决。

我在 getpostman.com 上偶然发现了newmancli 工具。它是一个 CLI 开源工具,可以运行你保存在 Postman 集合中的测试,并提供任何现代测试工具所期望的典型错误状态输出/控制台输出,这意味着你可以将其集成到你的 CI/CD 工作流程中。

对于没用过 Postman 的人来说,它是一款非常棒的工具,可以用来向服务发起请求、保存连接集合等等。如果你从事几乎所有基于 Web 的开发工作,它都是你的必备工具。如果你比较老派,喜欢用 cURL 做所有事情?没问题,它可以帮你导入和导出 cURL 命令。快去试试吧。

替代文本
https://www.getpostman.com/

对我来说唯一的问题是——我不太会用 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)
})

Enter fullscreen mode Exit fullscreen mode

所以,我们有三个端点可以使用:/as/fooas 。端点中有一些验证。我添加了它并将其添加到响应中GET以确保它们是唯一的。/fooPOSTPOST /fooexpress-request-id

开始收藏

我一边写博客一边学习,所以如有回溯,请多包涵!我已经进入 Postman 并创建了一个名为 的新合集postman-newman-testing

邮递员收藏集创建
一个好的开始,创建了一个空的集合

我仔细创建并保存了三个端点的请求,并为每个端点添加了一些描述:

替代文本

已将三个请求添加到集合中。如果您遇到问题,我推荐您参考 Postman 学习中心 (https://learning.getpostman.com/) 上非常有用的文档。

添加一些测试:

记住,这里的目标是创建一些可以帮助我们运行部署后测试的东西,所以我们将为每个端点在集合中定义一些简单的测试。我想确保:

  • 我收到requestId每个回复
  • 我收到了200每个回复
  • 500当我预期出现错误时,我可以触发响应
  • POST /fooGET /foo端点的预期值返回

正如您所期望的,测试脚本的文档全部位于Postman 学习中心,幸运的是,对于以前使用过测试和 JS 的人来说,它非常熟悉。

因此,经过一些尝试后,我发现了一些很酷的东西;当你进行测试时,每次执行该请求时都会执行它们,因此如果您使用 Postman 进行开发,您就不会“忘记”运行测试。

替代文本
每次都会执行四个测试,因此我们测试响应代码、响应的形状、返回的 JSON 类型以及它的速度是否符合我们的预期

变体

我想测试一个端点的两个不同输出:成功和失败,但我觉得没必要保存两个不同的请求来实现这一点。那么,我们该如何测试这个POST /foo端点呢?等我理解得更透彻后,我会再回过头来讨论这个问题。

自动化一切

我已经为我的集合设置了所有快乐路径测试,如果打开 Collection Runner 并运行我的集合(..),那么我会看到一个漂亮的绿色方框板,告诉我我的 API 在非常基本的层面上正在做我期望它做的事情。

替代文本

一切都是 5 x 5

我们来锻炼吧newman

我已经从 Postman 导出了集合并将其存储docs/postman-collection.json在项目根目录中,安装了newman$ npm install --save-dev newman),然后运行命令来运行测试:

替代文本

那里有各种各样精彩的输出!

这真是太神奇了,我做了一些简单的 API 测试,但这对我没有任何好处,原因很简单,在我的集合中,我的所有 URL 都设置为http://localhost:8081,所以我需要想办法改变它。

经过一番点击和谷歌搜索,我们终于可以做到了。Postman 支持环境设置——你可以在主窗口的右上角看到它们。我创建了几个环境(“开发”和“暂存”),并在host它们中分别用http://localhost:8081fordevelopmenthttps://api.mydomain.com:3000forstaging环境创建了一个名为的值。这些操作有点繁琐,就像 Postman 用户界面的其他部分一样,但还是可以实现的 ;)

替代文本

解决这个问题花了太长时间

接下来,我们进入集合并更改已保存请求中的主机名以使用{{host}}- 该{{ }}方法是 Postman 处理环境变量的方式,可以用于 API 密钥之类的东西。

替代文本

如您所见,我已将主机名更改为 `{{host}}/`,并且我正在使用 `development` 环境,一切正常

那么让我们将其转化为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"
  }
}

Enter fullscreen mode Exit fullscreen mode

然后我们可以根据需要处理环境配置,然后运行

npm run test-post-deploy
Enter fullscreen mode Exit fullscreen mode

执行测试!

结论

虽然它可能是另一组需要维护的测试和定义(我真的希望它基于我们的 OpenAPI 规范文档,但我稍后会弄清楚),但这似乎是实现两件事的好方法:

  1. 一组非常简单的测试,用于部署后运行或作为监控工具的一部分
  2. 可以将收集文件分发给使用 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
PREV
在 Windows 上安装 Doom Emacs
NEXT
使用 JavaScript 下载图像📸