Portman配置文件完全指南:自定义测试规则与请求覆盖策略 Portman配置文件完全指南自定义测试规则与请求覆盖策略【免费下载链接】portmanPort OpenAPI Specs to Postman Collections, inject test suite and run via Newman ‍项目地址: https://gitcode.com/gh_mirrors/po/portmanPortman是一款强大的工具能够将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为Spacexmonetary_amount为75000resource为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属性设置为falseappend属性设置为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),仅供参考