如何用Karate测试返回HTTP分块传输开放流的GET接口?
Karate测试HTTP分块传输开放流接口:可行及解决挂起问题的方案
Karate完全可以测试这类返回开放流的分块传输接口,但你当前的测试会挂起,原因是Karate默认会等待服务器关闭响应流才完成请求处理,而开放流会持续推送数据、不会主动关闭连接,导致测试一直处于等待状态。
下面是几种解决思路:
1. 设置读取超时限制
通过配置readTimeout,让Karate在指定时长后自动终止请求,同时可以验证超时前是否收到预期的分块数据:
Given url 'https://stream.wikimedia.org' And path 'v2/stream/recentchange' And configure readTimeout = 5000 # 5秒后超时终止 When method get Then status 200 And responseHeaders['Transfer-Encoding'] contains 'chunked' # 验证是否收到了部分响应内容 And response contains 'wiki'
2. 主动读取指定数量的分块后终止
如果需要精准控制接收的分块数量,可以利用Karate的Java集成能力,自定义逻辑读取指定条数后主动关闭流:
* def client = Java.type('org.apache.http.impl.client.CloseableHttpClient').createDefault() * def request = new Java.type('org.apache.http.client.methods.HttpGet')('https://stream.wikimedia.org/v2/stream/recentchange') * def response = client.execute(request, new Java.type('org.apache.http.impl.client.BasicResponseHandler') { @Override public String handleResponse(org.apache.http.HttpResponse resp) throws IOException { def entity = resp.getEntity() if (!entity) return null def reader = new BufferedReader(new InputStreamReader(entity.getContent())) def sb = new StringBuilder() def line def count = 0 // 读取3条分块数据后停止 while ((line = reader.readLine()) != null && count < 3) { sb.append(line) count++ } reader.close() return sb.toString() } }) * assert response != null * assert response.contains('type') * client.close()
3. 使用Karate 1.0+的流式处理特性
Karate 1.0及以上版本支持stream关键字,可以直接流式处理响应,无需等待流关闭:
Given url 'https://stream.wikimedia.org' And path 'v2/stream/recentchange' When method get Then status 200 * def stream = response.stream * def lines = [] * def line * while (line = stream.readLine()) { lines.add(line) if (lines.size() == 3) break // 读取3条后终止循环 } * stream.close() * assert lines.size() == 3 * assert lines[0].contains('recentchange')
内容的提问来源于stack exchange,提问作者mihais
相关产品推荐
相关产品推荐

