Portman配置文件完全指南:自定义测试规则与请求覆盖策略
【免费下载链接】portmanPort OpenAPI Specs to Postman Collections, inject test suite and run via Newman 👨🏽🚀项目地址: https://gitcode.com/gh_mirrors/po/portman
Portman是一款强大的工具,能够将OpenAPI规范转换为Postman集合,并注入测试套件,通过Newman运行。本文将详细介绍Portman配置文件的使用方法,帮助你自定义测试规则与请求覆盖策略,提升API测试效率。
配置文件基础
Portman的配置文件是实现自定义测试规则和请求覆盖策略的核心。在项目中,有两个关键的配置文件:portman-config.default.json和portman-config.example.json。前者提供了默认的配置模板,后者则展示了各种高级配置选项。
默认配置文件
portman-config.default.json是Portman的默认配置文件,它定义了基础的测试规则和全局设置。以下是该文件的主要结构:
{ "version": 1.0, "tests": { "contractTests": [ { "openApiOperation": "*::/*", "statusSuccess": { "enabled": true }, "contentType": { "enabled": true }, "jsonBody": { "enabled": true }, "schemaValidation": { "enabled": true }, "headersPresent": { "enabled": true } } ], "contentTests": [], "extendTests": [], "variationTests": [] }, "assignVariables": [], "overwrites": [], "globals": { "collectionPreRequestScripts": [], "keyValueReplacements": {}, "valueReplacements": {}, "rawReplacements": [] } }这个默认配置为所有API操作启用了基本的契约测试,包括状态码检查、内容类型验证、JSON body验证、 schema验证和请求头检查。
示例配置文件
portman-config.example.json提供了更丰富的配置示例,展示了如何自定义测试规则、变量赋值和请求覆盖等高级功能。你可以参考这个文件来编写自己的配置。
自定义测试规则
Portman允许你通过配置文件自定义各种测试规则,包括契约测试、内容测试、扩展测试和变体测试。
契约测试
契约测试用于验证API是否符合OpenAPI规范中定义的契约。在tests.contractTests数组中,你可以定义多个契约测试规则。
例如,以下配置为所有以/crm/开头的API操作启用了状态码成功检查、响应时间限制(300ms)、内容类型验证、JSON body验证、schema验证和请求头检查:
{ "tests": { "contractTests": [ { "openApiOperation": "*::/crm/*", "statusSuccess": { "enabled": true } }, { "openApiOperation": "*::/crm/*", "excludeForOperations": ["leadsAdd", "GET::/crm/leads/{id}"], "responseTime": { "enabled": true, "maxMs": 300 } }, { "openApiOperation": "*::/crm/*", "contentType": { "enabled": true } }, { "openApiOperation": "*::/crm/*", "jsonBody": { "enabled": true } }, { "openApiOperation": "*::/crm/*", "schemaValidation": { "enabled": true } }, { "openApiOperation": "*::/crm/*", "headersPresent": { "enabled": true } } ] } }你还可以使用excludeForOperations属性排除某些特定的API操作。
内容测试
内容测试用于验证API响应中的具体内容。在tests.contentTests数组中,你可以定义基于操作ID的内容测试规则。
例如,以下配置为leadsAll操作添加了响应body内容测试,验证返回数据中的company_name为"Spacex",monetary_amount为75000,resource为"companies":
{ "tests": { "contentTests": [ { "openApiOperationId": "leadsAll", "responseBodyTests": [ { "key": "data[0].company_name", "value": "Spacex" }, { "key": "data[0].monetary_amount", "value": 75000 }, { "key": "resource", "value": "companies" } ] } ] } }扩展测试
扩展测试允许你添加自定义的测试脚本,以满足特定的测试需求。在tests.extendTests数组中,你可以定义基于操作ID的扩展测试规则。
例如,以下配置为leadsAdd操作添加了两个自定义测试脚本:
{ "tests": { "extendTests": [ { "openApiOperationId": "leadsAdd", "overwrite": false, "append": true, "tests": [ "pm.test('200 ok', function(){pm.response.to.have.status(200);});", "pm.test('check userId after create', function(){Number.isInteger(responseBody);}); " ] } ] } }overwrite属性设置为false,append属性设置为true,表示将自定义测试脚本追加到现有测试之后,而不是覆盖它们。
变体测试
变体测试用于测试API在不同条件下的行为,例如无效输入、缺失参数等。在tests.variationTests数组中,你可以定义基于操作ID的变体测试规则。
以下是一个变体测试的示例,为leadsAdd操作创建了一个名为"missingParams"的变体,模拟缺失first_name参数的情况,并验证API返回400状态码:
{ "tests": { "variationTests": [ { "openApiOperationId": "leadsAdd", "variations": [ { "name": "missingParams", "openApiResponse": "400", "overwrites": [ { "overwriteRequestBody": [ { "key": "first_name", "value": "", "overwrite": true } ] } ], "tests": { "contractTests": [ { "statusCode": { "enabled": true, "code": 400 }, "jsonBody": { "enabled": true } } ], "responseBodyTests": [ { "key": "resource", "value": "leads" } ], "extendTests": [ { "tests": [ "\npm.test('say hello Portman', function(){ \n console.log('Hello Portman')\n});" ] } ] } } ] } ] } }运行变体测试后,你可以在Postman中看到生成的变体测试用例,如下所示:
请求覆盖策略
Portman允许你通过配置文件覆盖API请求的各个部分,包括请求体、查询参数、路径参数和请求头。这在测试不同场景下的API行为时非常有用。
覆盖请求体
你可以使用overwrites.overwriteRequestBody属性来覆盖请求体中的特定字段。例如,以下配置为leadsAdd操作覆盖了company_name和monetary_amount字段,并移除了websites[0]和social_links[1].url字段:
{ "overwrites": [ { "openApiOperationId": "leadsAdd", "overwriteRequestBody": [ { "key": "company_name", "value": "{{$randomCompanyName}} {{$randomColor}}", "overwrite": true }, { "key": "monetary_amount", "value": "{{$randomInt}}", "overwrite": true }, { "key": "websites[0]", "remove": true }, { "key": "social_links[1].url", "remove": true } ] } ] }覆盖后的请求体在Postman中看起来如下所示:
覆盖查询参数
使用overwrites.overwriteRequestQueryParams属性可以覆盖请求的查询参数。例如,以下配置为leadsAll操作禁用了limit参数,并移除了cursor参数:
{ "overwrites": [ { "openApiOperationId": "leadsAll", "overwriteRequestQueryParams": [ { "key": "limit", "disable": true }, { "key": "cursor", "remove": true } ] } ] }覆盖路径参数
使用overwrites.overwriteRequestPathVariables属性可以覆盖请求的路径参数。例如,以下配置为DELETE::/crm/leads/{id}操作将id参数的值固定为"123456789":
{ "overwrites": [ { "openApiOperation": "DELETE::/crm/leads/{id}", "overwriteRequestPathVariables": [ { "key": "id", "value": "123456789", "overwrite": true } ] } ] }覆盖请求头
使用overwrites.overwriteRequestHeaders属性可以覆盖请求头。例如,以下配置为leadsUpdate操作覆盖了x-apideck-consumer-id请求头:
{ "overwrites": [ { "openApiOperationId": "leadsUpdate", "overwriteRequestHeaders": [ { "key": "x-apideck-consumer-id", "value": "portman-id-{{$randomInt}}", "overwrite": true } ] } ] }变量赋值
Portman允许你从请求和响应中提取值,并将其赋值给Postman集合变量,以便在后续请求中使用。这在测试依赖于先前请求结果的API时非常有用。
从响应中提取变量
使用assignVariables.collectionVariables属性可以从响应中提取值并赋值给集合变量。例如,以下配置从GET::/crm/leads/{id}操作的响应body中提取data.company_name,从响应头中提取Operation-Location:
{ "assignVariables": [ { "openApiOperation": "GET::/crm/leads/{id}", "collectionVariables": [ { "responseBodyProp": "data.company_name" }, { "responseHeaderProp": "Operation-Location" } ] } ] }从请求中提取变量
你还可以从请求中提取值并赋值给集合变量。例如,以下配置从leadsAdd操作的请求body中提取company_name:
{ "assignVariables": [ { "openApiOperationId": "leadsAdd", "collectionVariables": [ { "requestBodyProp": "company_name", "name": "leadsAdd.company_name" } ] } ] }直接赋值变量
除了从请求和响应中提取值外,你还可以直接为集合变量赋值。例如:
{ "assignVariables": [ { "openApiOperationId": "leadsAdd", "collectionVariables": [ { "value": 12345, "name": "leadsAdd.fixed.number" }, { "value": "portman", "name": "leadsAdd.fixed.string" } ] } ] }全局配置
Portman的全局配置允许你定义适用于整个集合的设置,包括前置请求脚本、键值替换、值替换和原始替换。
集合前置请求脚本
使用globals.collectionPreRequestScripts属性可以定义适用于整个集合的前置请求脚本。例如:
{ "globals": { "collectionPreRequestScripts": [ "pm.collectionVariables.set('status', pm.iterationData.get('status') || 'open')" ] } }键值替换
使用globals.keyValueReplacements属性可以替换请求中的特定键值对。例如:
{ "globals": { "keyValueReplacements": { "x-apideck-app-id": "{{applicationId}}" } } }值替换
使用globals.valueReplacements属性可以替换请求中的特定值。例如:
{ "globals": { "valueReplacements": { "<Bearer Token>": "{{bearerToken}}" } } }原始替换
使用globals.rawReplacements属性可以替换请求中的原始文本。例如:
{ "globals": { "rawReplacements": [ { "searchFor": "Unify", "replaceWith": "Unify ApiDeck" } ] } }实际应用示例
下面是一个完整的Portman配置文件示例,展示了如何结合使用各种配置选项来实现自定义测试规则和请求覆盖策略:
{ "version": 1.0, "tests": { "contractTests": [ { "openApiOperation": "*::/crm/*", "statusSuccess": { "enabled": true }, "responseTime": { "enabled": true, "maxMs": 300 }, "contentType": { "enabled": true }, "jsonBody": { "enabled": true }, "schemaValidation": { "enabled": true }, "headersPresent": { "enabled": true } } ], "contentTests": [ { "openApiOperationId": "leadsAll", "responseBodyTests": [ { "key": "data[0].company_name", "value": "Spacex" }, { "key": "data[0].monetary_amount", "value": 75000 } ] } ], "variationTests": [ { "openApiOperationId": "leadsAdd", "variations": [ { "name": "missingParams", "openApiResponse": "400", "overwrites": [ { "overwriteRequestBody": [ { "key": "first_name", "value": "", "overwrite": true } ] } ], "tests": { "contractTests": [ { "statusCode": { "enabled": true, "code": 400 } } ] } } ] } ] }, "assignVariables": [ { "openApiOperation": "POST::*", "collectionVariables": [ { "responseBodyProp": "data.id" } ] } ], "overwrites": [ { "openApiOperationId": "leadsAdd", "overwriteRequestBody": [ { "key": "company_name", "value": "{{$randomCompanyName}}", "overwrite": true } ] } ] }应用这个配置后,Portman将生成包含自定义测试规则和请求覆盖策略的Postman集合。你可以在Postman中查看生成的契约测试,如下所示:
总结
Portman配置文件提供了丰富的选项,允许你自定义测试规则和请求覆盖策略,以满足不同的API测试需求。通过合理配置tests、assignVariables、overwrites和globals等部分,你可以构建强大而灵活的API测试套件。
希望本文能够帮助你更好地理解和使用Portman配置文件。开始使用Portman,提升你的API测试效率吧!
【免费下载链接】portmanPort OpenAPI Specs to Postman Collections, inject test suite and run via Newman 👨🏽🚀项目地址: https://gitcode.com/gh_mirrors/po/portman
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考