Karate框架读取.gql文件多命名查询的方法求助
在Karate中从单个GQL文件读取指定命名查询的解决方案
错误原因
Karate的read()函数仅接受1个参数,你传入两个参数的写法不符合函数定义,因此触发了参数数量不匹配的Arity error。
可行实现方案
方案1:利用Karate模板渲染(推荐,简洁易维护)
把GQL文件改写成Karate支持的模板格式,通过传入参数指定要使用的查询:
修改你的requestGraphQL.gql内容如下:
#if (__queryName == 'ExampleQuery1') query ExampleQuery1 { users { id name } } #elif (__queryName == 'ExampleQuery2') query ExampleQuery2 { posts { id title } } #elif (__queryName == 'CreateUser') mutation CreateUser { createUser(input: {name: "test"}) { id } } #endif
然后在Scenario中这样调用:
Scenario: 读取指定GraphQL查询 Given def queryParams = { __queryName: 'ExampleQuery1' } Given request read('requestGraphQL.gql', queryParams) When method post Then status 200
通过传入__queryName参数,Karate会自动渲染并返回对应的查询内容。
方案2:自定义JS函数解析提取
如果GQL文件结构复杂,模板写法不够灵活,可以写一个JS工具函数来精准提取目标查询:
- 创建
gql-utils.js文件:
function getQuery(gqlContent, queryName) { const lines = gqlContent.split('\n'); let inTarget = false; let queryLines = []; let braceCount = 0; for (const line of lines) { const trimmed = line.trim(); // 匹配查询/突变的定义行 if (trimmed.startsWith(`query ${queryName} {`) || trimmed.startsWith(`mutation ${queryName} {`)) { inTarget = true; queryLines.push(line); braceCount = 1; continue; } if (inTarget) { queryLines.push(line); // 统计大括号数量,确保匹配到正确的闭合括号 for (const char of line) { if (char === '{') braceCount++; if (char === '}') braceCount--; if (braceCount === 0) { inTarget = false; break; } } } } return queryLines.join('\n'); }
- 在Scenario中调用该函数:
Scenario: 通过工具函数提取查询 Given def gqlUtils = read('gql-utils.js') Given def gqlContent = read('requestGraphQL.gql') Given def targetQuery = gqlUtils.getQuery(gqlContent, 'ExampleQuery1') Given request targetQuery When method post Then status 200
方案3:正则表达式提取(快速临时方案)
如果只是简单场景,也可以用正则直接从文件内容中匹配提取:
Scenario: 正则提取指定查询 Given def gqlContent = read('requestGraphQL.gql') # 提取ExampleQuery1的内容,(?s)开启DOTALL模式让.匹配换行符 Given def targetQuery = gqlContent.replaceAll(/(?s).*query ExampleQuery1 \{(.*)\}.*?^}/, 'query ExampleQuery1 {$1}') Given request targetQuery When method post Then status 200
注意:这种方法对GQL格式的一致性要求较高,查询嵌套复杂时容易匹配出错。
内容的提问来源于stack exchange,提问作者Hakan Aras
相关产品推荐
相关产品推荐

