Karate技术问询:如何获取被调用Feature的执行结果并输出至HTML测试报告
我来帮你搞定这个测试里的问题——你现在遇到两个核心痛点:一是调用预加载数据的Scenario后,拿不到正确的执行结果;二是希望被调用Feature的执行细节自动出现在HTML测试报告里,不用手动写一堆print。下面一步步给你解决:
一、先搞定x.result无输出的问题
你用call调用Scenario时,返回的对象默认不会自动带上response,得在被调用的Scenario里明确返回你需要的变量。看你的代码,你在@add-desk里定义了* def result = response,但没加返回语句,所以调用方拿不到这个值。修改被调用的Scenario:
@add-desk Scenario: Add a desk to the database Given text query = """ mutation { createDesks( desks: [ { name: "FX Desk" } { name: "Muni Desk" } ] ) { name groupName deskId } } """ And request { query: '#(query)' } When method post Then status 200 * match response.data.createDesks[0] contains { groupName: 'GBI' } * def result = response # 关键:用return把结果返回给调用方 * return result
改完之后,在调用方* def x = call read ('Mutations.feature@add-desk'),x就是你返回的完整response对象了,直接print x就能看到所有数据,或者print x.data.createDesks查看插入的desk列表。
二、让被调用Feature的内容自动进HTML报告
Karate的HTML报告本来就支持自动合并被调用Feature的执行细节,不用手动print,只要做这几个配置:
1. 开启自动记录请求/响应到报告
在你的karate-config.js里添加这两行配置,让所有HTTP请求和响应都自动格式化后写入报告:
config.logPrettyResponse = true; config.logPrettyRequest = true;
这样你可以删掉所有手动写的* print 'response:', response,报告里会自动展示每一次请求的报文和响应,格式还更美观。
2. 确保被调用Feature的日志被合并到主报告
当你用call调用Scenario时,Karate会自动把被调用Feature的步骤、断言、日志都合并到主Feature的报告里。只要你运行测试时开启了HTML报告生成(比如用Maven执行mvn test,或者IDE里用Karate插件运行),就能在报告里看到预加载数据的完整执行过程,包括请求内容、响应结果、断言是否通过。
3. 可选:给预加载步骤加标记日志
如果你想在报告里更清晰地看到“这一步是预加载数据”,可以在被调用Scenario开头加个日志语句,这个日志会自动出现在报告的对应步骤里:
@add-desk Scenario: Add a desk to the database * print '=== 开始预加载测试用Desk数据 ===' # 后续步骤...
三、额外验证:确保预加载真的成功了
你提到get请求返回空,建议在调用完预加载Scenario后,先断言返回的结果是否符合预期,这样能提前发现预加载失败的问题,不用等到get请求才排查:
Scenario: get desks * def x = call read ('Mutations.feature@add-desk') # 先验证预加载的数据是否插入成功 * match x.data.createDesks[*].name contains ['FX Desk', 'Muni Desk'] # 再执行getDesks请求 Given text query = """ { getDesks{ deskId name groupName trader{ traderId initials userId } } } """ And request { query: '#(query)' } When method post Then status 200 * match response.data.getDesks[*].name contains ['FX Desk', 'Muni Desk']
这样如果预加载失败,会在第一时间抛出错误,方便你定位问题。
内容的提问来源于stack exchange,提问作者Steve

