并行执行DB_Search与Elastic_Search类时出现session-expired问题求助
问题分析与解决
核心原因
你遇到的问题本质是RestAssured的baseURI是静态变量,并行执行时线程不安全。两个测试类同时修改RestAssured.baseURI,会导致其中一个类的请求被发送到错误的环境(比如本来要发PROD的请求,被覆盖成STAGE的baseURI,或者反过来),从而拿到错误的session,最终出现session-expired响应。
解决方案
不要依赖静态的RestAssured.baseURI,改用RequestSpecification创建独立的请求实例,每个测试类维护自己的请求配置,彻底避免静态变量的线程冲突。
修改后的DB_Search类
public class DB_Search { @Test public void FinBlock() throws IOException, ParseException { // 创建独立的RequestSpecification实例,配置STAGE环境的baseURI RequestSpecification stageRequest = new RequestSpecBuilder() .setBaseUri("login_api") // STAGE的登录API地址 .addFilter(new SessionFilter()) .build(); // 登录获取session String sessionId = given(stageRequest) .auth().preemptive().basic("******", "****") .when().get() .then().extract().response().getCookie("RAY_SESSION_ID"); // 用获取到的sessionId发起业务请求 Response resp = given(stageRequest) .cookie("RAY_SESSION_ID", sessionId) .when().get("API") // STAGE的业务API地址 .then().extract().response(); // 写入响应到文件 try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("C:\\Users\\***\\eclipse-workspace\\API_test\\Files\\output.json"))) { bufferedWriter.write(resp.asString()); } } }
修改后的Elastic_Search类
public class Elastic_search { @Test public void FinBlock() throws IOException, ParseException { // 创建独立的RequestSpecification实例,配置PROD环境的baseURI RequestSpecification prodRequest = new RequestSpecBuilder() .setBaseUri("Login_API") // PROD的登录API地址 .addFilter(new SessionFilter()) .build(); // 登录获取session String sessionId = given(prodRequest) .auth().preemptive().basic("****", "***") .when().get() .then().extract().response().getCookie("RAY_SESSION_ID"); // 用获取到的sessionId发起业务请求 Response resp = given(prodRequest) .cookie("RAY_SESSION_ID", sessionId) .when().get("main_api") // PROD的业务API地址 .then().extract().response(); // 写入响应到文件 try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("C:\\Users\\***\\eclipse-workspace\\API_test\\Files\\output1.json"))) { bufferedWriter.write(resp.asString()); } } }
额外优化点
- 使用try-with-resources语法自动关闭BufferedWriter,避免手动关闭可能出现的资源泄漏。
- 每个测试方法的
SessionFilter保持独立实例,确保会话隔离,避免跨测试的会话干扰。
内容的提问来源于stack exchange,提问作者ramesh
相关产品推荐
相关产品推荐

