进阶用法

以下会介绍 Postman 的进阶用法:AI 助手 Postbot 试用介绍报告。

最近在参加 Ministry 测试社区发起的 30 天 AI 测试挑战活动时,其中一个挑战是选择不同的 AI 测试工具进行使用,刚好我选择了 Postman 的 AI Assistant Postbot,单独发出来大家可以参考使用。

1. 关于选择一个工具

这一次我选择了 Postman AI Assistant,因为项目中我正在实施 API 测试和 API 自动化回归测试,希望能从 Postman AI Assistant 工具的试用过程中得到一些使用 AI 提升 API 测试效率且能落地的实践。

关于 Postman 工具的使用:Postman 自从 2023 年 5 月宣布将逐步淘汰具有离线功能的 Scratch Pad 模型,大部分功能将转移到云端,需要必须登录才能使用 Postman 的全部功能后。我们公司已经通知要停止使用 Postman 并要迁移到其他的工具。之后我一直在调研和学习使用 Bruno,一个开源且能替代 postman 完成 API 测试和 API 自动化回归测试的好工具。最近也在项目团队中落地了 Bruno+github 的接口文档管理和接口自动化测试的实践,与开发人员一起使用 Bruno+github 协作完成 API 的管理和测试工作。

Postman AI Assistant 官方的介绍:

用于 API 工作流的 AI Assistant Postbot 将于 2023 年 5 月 22 日推出早期访问计划。

  • 📅 可用性:早期访问计划于 2023 年 5 月 22 日启动。
  • 🪄✨功能:人工智能驱动的自动完成、测试用例设计、文档编写、测试套件构建、数据报告汇总、API 调用调试。
  • 💳 定价:从 2023 年 10 月 15 日起提供基本和专业计划,每用户每月 9 美元。

我下载 Postman 并使用常用的 demo 接口进行了 Postbot 的试用:

2. 关于创建一些测试代码

在 postman 界面上添加完 demo 接口的 request 后,点击界面底部菜单栏上的 Postbot 即可启动 Postman AI Assistant,Postbot 窗口上出现针对 request 的建议指令菜单,当前有如下几个推荐指令:

  • Add tests to this request
  • Test for response
  • Visualize response
  • Save a field from response
  • Add documentation

接下来我会一个接一个的试用 Postbot 建议的功能。

试用Add tests to this request

在 Postbot 界面上点击Add tests to this request

如果你添加了 request 后还没点击 send 运行过该 request, Postbot 会提示"I‘ll need a response to perform this action",然后 Postbot 也会给出快捷运行 request 输出 response 的菜单;点击"Send request and continue"按钮后 Postman 会自动运行 request 并编写测试脚本,如下图所示:

Postbot 针对 demo request 编写测试脚本如下:

pm.test("Response status code is 201", function () {
    pm.response.to.have.status(201);
});

pm.test("Response has the required fields - title, body, userId, and id", function () {
    const responseData = pm.response.json();
    pm.expect(responseData.title).to.exist;
    pm.expect(responseData.body).to.exist;
    pm.expect(responseData.userId).to.exist;
    pm.expect(responseData.id).to.exist;
});

pm.test("Title is a non-empty string", function () {
    const responseData = pm.response.json();
    pm.expect(responseData).to.be.an('object');
    pm.expect(responseData.title).to.be.a('string').and.to.have.lengthOf.at.least(1, "Title should not be empty");
});

pm.test("Body is a non-empty string", function () {
    const responseData = pm.response.json();
    pm.expect(responseData).to.be.an('object');
    pm.expect(responseData.body).to.be.a('string').and.to.have.lengthOf.at.least(1, "Body should not be empty");
});

pm.test("UserId is a positive integer", function () {
    const responseData = pm.response.json();
    pm.expect(responseData.userId).to.be.a('number');
    pm.expect(responseData.userId).to.be.above(0, "UserId should be a positive integer");
});

编写的测试覆盖了接口 response 的 status 判断 和 body 字段类型判断,也能运行通过。

这时我发现 Postbot 的建议菜单上新增了两个推荐指令

  • Add more tests
  • Fix test

我先尝试运行了“Add more tests”,然后 Postbot 也新增了几条测试

但是有趣的是,有一个测试运行失败了,然后我点击运行“Fix test”尝试让 Postbot 去修复这一条错误的测试

然而 Postbot 并没有修复成功这一条错误的测试用例

这一条错误的用例如下:

pm.test("UserId matches the ID of the user who created the post", function () {
    const requestUserId = pm.request.json().userId;
    const responseData = pm.response.json();
    pm.expect(responseData.userId).to.equal(requestUserId);
});

我只能手动去修复它,修复后的脚本如下

pm.test("UserId matches the ID of the user who created the post", function () {

    const requestUserId = JSON
    .parse(pm.request.body.raw).userId;
    const responseData = pm.response.json();
    pm.expect(responseData.userId).to.equal(requestUserId);
});

脚本错误的原因是因为 request 的 body 为 raw 格式,需要将 request 的 body 解析为 json 对象后在进行进行读取。

试用Test for response

在 Postbot 界面上点击Test for response后,Postbot 会更新之前通过Add tests to this request生成的测试用例,如下图所示:

通过查看更新后的测试运行结果发现,更新后的用例大部分用例都没办法运行通过。

然后我尝试通过 Postbot 的“Fix test”去修复错误的用例,大部分的用例的都能运行通过,但还是出现了之前Add tests to this request指令生成且出现过的错误测试用例。

另外点击 Postbot 的“Fix test”去修复Test for response指令生成的用例是会将大部分用例都更新为Add tests to this request指令生成的测试用例

不知道Add tests to this requestTest for response两个指令的差异在哪里?

试用Visualize response

在 Postbot 界面上点击Visualize response后,需要选择生成的格式,格式可以选择表格/折线图/条形图,我这里选择为表格,然后 Postbot 会在 request 请求之后的结果页面展示 response 的实例化表格样式。

这个 response 的表格实例化展示是通过在 tests 下生成脚本实现的,具体的脚本如下:

var template = `
<style type="text/css">
    .tftable {font-size:14px;color:#333333;width:100%;border-width: 1px;border-color: #87ceeb;border-collapse: collapse;}
    .tftable th {font-size:18px;background-color:#87ceeb;border-width: 1px;padding: 8px;border-style: solid;border-color: #87ceeb;text-align:left;}
    .tftable tr {background-color:#ffffff;}
    .tftable td {font-size:14px;border-width: 1px;padding: 8px;border-style: solid;border-color: #87ceeb;}
    .tftable tr:hover {background-color:#e0ffff;}
</style>

<table class="tftable" border="1">
    <tr>
        <th>Title</th>
        <th>Body</th>
        <th>User ID</th>
        <th>ID</th>
    </tr>
    <tr>
        <td>{{response.title}}</td>
        <td>{{response.body}}</td>
        <td>{{response.userId}}</td>
        <td>{{response.id}}</td>
    </tr>
</table>
`;

function constructVisualizerPayload() {
    return {response: pm.response.json()}
}
pm.visualizer.set(template, constructVisualizerPayload());

目前没发现Visualize response这个功能对 API 测试的帮助在哪里。

使用Save a field from response

在 Postbot 界面上点击Save a field from response后,Postbot 会生成一个测试脚本脚本来将 response 中的 id 存储为环境变量,具体生成代码如下:

// Stores the postId in an environment or global variable
var postId = pm.response.json().id;
pm.globals.set("postId", postId);

然后我再次点击 Postbot 的Save a field from response指令,发现 Postbot 还是会生成将 response 中的 id 存储为环境变量的测试脚本,而不是生成存储 response 中的 其他字段存储为环境变量的测试脚本

试用Add documentation

在 Postbot 界面上点击使用Add documentation指令后,Postbot 会在 postman 界面右侧生成一个非常详细的接口文档,如下图所示

接口文档上描述了接口的请求信息,request 字段定义,response 返回示例等非常详细的接口相关信息。

3.关于分享我的想法

通过试用 postman 提供的 AI Assistant Postbot 工具,Postbot 提供的针对 request 和 response 添加测试用例功能还是比较方便的,能快速生成大部分部分可用的接口 response 验证测试脚本,测试脚本覆盖率也比较高,虽然生成的测试脚本中出现的错误的脚本,也需要人工进行修复,但是通过 Postbot 能快速生成测试脚本也能提升接口测试的效率。

另外 Postbot 的接口文档生成也比较使用,开发人员在 postman 添加好 request 后,通过 Postbot 能快速生成比较详细的接口文档,一定程度上能提升研发效率和接口文档质量。

但是 Postbot 目前好像还不支持自定义指令,我想尝试通过 Postbot 针对 demo 接口输出不同类型的测试用例,如空 request body 接口测试用例,不合法 request body 接口测试用例等,Postbot 没办法给出正确响应。

参考文档

推荐阅读


欢迎关注软件测试同学的公众号“软件测试同学”,原创 QA 技术文章第一时间推送。