You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Karate技术问询:如何获取被调用Feature的执行结果并输出至HTML测试报告

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 18:24:08