几个月前我换了工作和公司,很喜欢这样的变化,但多少会有些不知所措。现在事情已经安排好了一些,我可以回来做一些我喜欢的事情。
现在正在工作的团队是一个新团队,我们正在努力弄清楚我们的流程,并试图尽可能地实现自动化。为此,我承担了 API 自动化测试的工作。
我想遵循与上次相同的方案,即通过 CI/CD 使用 Newman,正如我在“使用 Newman 自动化 API 测试”中所写的那样。 但是我遇到了一个有趣的工具,叫做 Portman,想尝试一下。 上次所做的工作非常好,但不得不通过 Postman 维护 Postman 中保存的请求集,这有点痛苦。 这也将更接近规范驱动的开发,其中 OpenAPI 规范将驱动一切。
使用 Portman,不仅可以生成 Postman 请求集合供 Newman 使用,而且还包括所有的合约、内容和模糊测试以及用于处理身份验证的预请求脚本。
需要的配置文件
Portman 使用了一些需要配置的文件来将所有内容结合在一起。 Portman 可以设置为将请求集合与所正在做的Postman Team/Workspace 同步。关键文件可以根据需要更改名称,我的名称是基于我在 GitHub 的 Portman 示例中找到的名称。
portman-cli-options.json
这个文件只是让在调用 Portman 时不必将所有内容添加到命令行。 当然也可以将所有内容作为选项传递给 Portman,但是将所有内容指定在一个位置并将其存储在存储库中会更简洁
{
"local": "./user-api.yaml",
"baseUrl": "http://portal.example.com",
"output": "./api.postman.json",
"portmanConfigFile": "./portman-config.api.json",
"postmanConfigFile": "./postman-config.api.json",
"envFile": "./.env-portman",
"includeTests": true,
"syncPostman": true,
"runNewman": false,
"postmanWorkspaceName":"MyTeam",
"collectionName": "User"
}
postman-config.api.json
postman解析值的选项。为了更好地了解选项是什么,请看这里。 我将此文件与示例提供的文件保持一致。
.env-postman
如果你正在同步到 Postman 云,则需要把API 密钥放在此文件中。这个文件有一个KVPPOSTMAN_API_KEY=<key>
portman-config.api.json
这是将要配置的主文件,可以在里面定义全局设置,例如预请求脚本、特定测试(内容、合同、模糊测试等)或 Portman 的许多其他功能。
要做的第一件事是设置预请求脚本,该脚本将从登录服务获取 JWT,然后在后续的每一个请求中使用它。 有关创建此脚本的更多信息,请查看我之前写的一篇题为“在 Postman / Newman 中自动获取不记名令牌以获取集合”的文章。
这是在“globals”模块中定义。如果在Portman中配置多个前置请求,每个请求应该以“;”结束(这一点有别于Postman),并且每个请求务必在一行内书写,就像下面示例一样:
"globals": {
"stripResponseExamples": true,
"collectionPreRequestScripts": [
"pm.sendRequest({ url: pm.environment.get('baseUrl')+'/user/v1/login',method: 'POST',header: {'Accept': 'application/json','Content-Type': 'application/x-www-form-urlencoded'},body: {mode: 'raw',raw: 'u='+pm.environment.get('username')+'&p='+pm.environment.get('password')}},(err, res) => {pm.environment.set('ACCESS', res.headers.get('x-auth')); pm.environment.set('org', res.json().org); pm.request.headers.add({key: 'x-token',value: res.headers.get('x-auth')})});"
]
}
下一个将定义的是测试,这是一个同时使用Content和Contract tests的示例。 这些是非常简单的测试,但可以扩展很多,查看 Portman 实例中的 Contract Tests 和 Content Tests 以便更好地了解可以做什么。
"tests": {
"contentTests": [
{
"openApiOperation": "[GET]::/user/v1/user/whoami",
"responseBodyTests": [
{
"key": "username",
"value": "testuser@example.com"
},
{
"key": "org",
"value": "SpaceX"
}
]
}
],
"contractTests": [
{
"openApiOperation": "*::/user/*",
"statusSuccess": {
"enabled": true
}
}, {
"openApiOperation": "*::/user/*",
"responseTime" : {
"enabled": true,
"maxMs": 300
}
}, {
"openApiOperation": "*::/user/*",
"contentType": {
"enabled": true
}
}, {
"openApiOperation": "*::/user/*",
"jsonBody": {
"enabled": true
}
}, {
"openApiOperation": "*::/user/*",
"schemaValidation": {
"enabled": true
}
}, {
"openApiOperation": "*::/user/*",
"headersPresent": {
"enabled": true
}
}
]
},
运行 Portman
现在已经配置了所有文件,可以将 OpenAPI yaml/json 文件转换到postman集合中。
由于设置了 CLI 选项文件,因此,只需将一个选项传递给 portman 命令行,即cliOptionsFile <options file>
,Portman 将处理剩下的内容。
portman --cliOptionsFile ./portman-cli-options.json
现在,可以将其添加到CI/CD 管道中以动态创建测试用例,并确保在每次构建时都对API 进行全面测试。
总结
看看Portman examples,里面有很多很好的信息! 文档很不错,但不是都在同一个地方,所以可能有点难以找到,但是通过示例将提供很多见解!
拿我的设置来说,先将其同步到 Postman Team,以便可以通过 Postman 应用程序查看 Postman 集合。如果你是这样做,请记住,虽然该选项称为同步,但它实际上只是从 Portman 到 Postman 的覆盖。 在刚开始的测试中,这让我踩了好几次坑,因为我没有将我在 Postman 中对集合所做的编辑保存到 portman-config 文件中,然后运行 Portman。
如果你喜欢这篇文章或我之前写的任何文章,请给它一个点个赞或关注我。 感谢您的阅读!