RestAssured+Cucumber多数据集执行时GET接口查询参数叠加问题
结论
该问题不是RestAssured的已知问题,核心原因为请求实例未做隔离导致参数累加。
问题根因
你代码中使用的req请求对象、RequestSpecification()返回的请求规格实例是类级别的共享变量。Cucumber执行Scenario Outline的每条示例用例时,不会自动重置这些跨用例的共享变量,第二次执行queryParam("size", size)操作时,会往同一个请求实例中追加新的参数,而非覆盖原有参数,最终出现两个size参数拼接的情况。
如果你的RequestSpecification()是自行封装的公共方法,若方法返回的是单例实例,也会触发同样的参数累加问题。
解决方案
- 优先将请求变量改为方法内的局部变量,每次发起请求都创建全新的请求实例,从根源避免参数污染,修改后的步骤定义代码参考:
@When("^user calls the getScenePaginationAPI endpoint with the GET request with \"([^\"]*)\"$") public void user_calls_the_getScenePaginationAPI_endpoint_with_the_GET_request_with(int size) throws IOException { // 方法内创建新的请求实例,不使用类级别的共享req变量 RequestSpecification req = given().relaxedHTTPSValidation().urlEncodingEnabled(false) .spec(new RequestSpecBuilder().build()) .queryParam("size",size); String resourceAPI = endpointResources.getScenePaginationAPI(); Response response = req.when().get(resourceAPI); logger.info("Response Data: "+response); }
- 若需要复用公共请求配置(比如统一域名、全局header),每次使用前克隆新的实例,或者调用
reset()方法重置实例:
// 公共请求配置示例 private static RequestSpecification publicSpec = new RequestSpecBuilder() .setBaseUri("https://testing.company.com") .build(); // 每次使用时克隆新实例,避免修改公共配置 RequestSpecification req = given().spec(publicSpec.clone()) .queryParam("size", size);
- 新增Cucumber After钩子方法,每条用例执行结束后清空所有类级别的请求、响应变量,彻底避免跨用例的数据污染。
内容的提问来源于stack exchange,提问作者Vishvesh Savant
相关产品推荐
相关产品推荐

