Karate测试中意外发起重复请求问题排查
解决Karate自动发起重复请求的问题
我完全明白你的困扰:你的Karate测试场景本来只期望发送一次GET请求并拿到302状态码,但实际执行时,Karate自动发起了第二个带Cookie的请求,最终返回200状态,直接导致你的断言失败。
问题根源
Karate默认的两个行为引发了这个问题:
- 自动跟随HTTP重定向:当收到3xx(比如302)响应时,Karate会自动依据响应头里的
Location发起新请求。 - 自动维护Cookie会话:Karate会自动保存响应中的
Set-Cookie内容,并在后续同域名的请求里自动带上这些Cookie。
结合你的日志来看:第一次无Cookie请求返回302并设置了linkCookie,Karate自动带着这个Cookie发起了第二次请求,而服务器对带Cookie的请求返回了200的登录页面,最终让你的Then status 302断言不通过。
解决方案
你只需要在测试中禁用Karate的自动重定向功能,让它只执行一次请求并停在302响应上即可。通过配置followRedirects = false就能实现:
修改后的Feature代码:
Feature: Get the authorization Scenario: Retrieve Login page url Given url 'http://someUri:port' And path '/secure/author' And param response_type = 'code' And param client_id = 'valid_clientID' And param scope = 'link_submit' And param redirect_uri = 'https://someotherUri' # 禁用自动重定向,阻止Karate发起后续请求 And configure followRedirects = false When method get Then status 302 # 可选:可以额外验证返回的登录页面URL是否符合预期 Then match header Location == 'http:wantedurl.com'
额外说明
- 如果后续测试需要用到Cookie保持会话,你可以在需要的场景再启用自动重定向,或者手动管理Cookie内容。
- 如果你核心需求就是获取302响应里的登录页面URL,禁用自动重定向后就能直接提取这个值,完全不需要处理后续请求。
这样修改后,Karate只会发送一次请求,拿到302响应后就停止执行,你的断言就能正常通过了。
内容的提问来源于stack exchange,提问作者Niron Rasanjana Perera
相关产品推荐
相关产品推荐

