如何在Rest Assured中运行API自动化前置脚本?
在Rest Assured中实现前置脚本的几种方式
在Rest Assured里实现Postman那种前置脚本,本质就是在发送目标API请求前,先执行准备逻辑(比如获取token、设置公共参数、初始化环境等),下面是几种常用的实现方式:
1. 直接在测试方法内编写前置逻辑
如果只是单个测试需要简单的前置操作,直接在发送目标请求前写对应的代码就行,比如先调用登录接口拿token,再用这个token访问受保护的接口:
import io.restassured.RestAssured; import io.restassured.response.Response; public class SimplePreRequestTest { public static void main(String[] args) { // 前置脚本:调用登录接口获取token Response loginResp = RestAssured.given() .contentType("application/json") .body("{\"username\":\"test\",\"password\":\"123456\"}") .post("/api/login"); String authToken = loginResp.jsonPath().getString("data.token"); // 目标API请求:用拿到的token访问用户信息接口 RestAssured.given() .header("Authorization", "Bearer " + authToken) .get("/api/user/profile") .then() .statusCode(200); } }
2. 借助测试框架的前置注解
如果多个测试方法需要共享相同的前置逻辑(比如所有接口都需要token),可以用TestNG/JUnit的前置注解来统一执行:
TestNG示例(@BeforeMethod)
import io.restassured.RestAssured; import io.restassured.response.Response; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class SharedPreRequestTest { private String authToken; // 每个@Test方法执行前都会先跑这个前置逻辑 @BeforeMethod public void setupAuth() { Response loginResp = RestAssured.given() .contentType("application/json") .body("{\"username\":\"test\",\"password\":\"123456\"}") .post("/api/login"); authToken = loginResp.jsonPath().getString("data.token"); } @Test public void testGetUserProfile() { RestAssured.given() .header("Authorization", "Bearer " + authToken) .get("/api/user/profile") .then() .statusCode(200); } @Test public void testUpdateUserInfo() { RestAssured.given() .header("Authorization", "Bearer " + authToken) .contentType("application/json") .body("{\"nickname\":\"新昵称\"}") .put("/api/user/info") .then() .statusCode(200); } }
3. 封装前置逻辑为工具类
把常用的前置操作(比如登录、生成签名、获取公共参数)封装成工具类的静态方法,方便在各个测试里复用:
工具类示例
import io.restassured.RestAssured; import io.restassured.response.Response; public class PreRequestTools { // 封装登录获取token的逻辑 public static String getAuthToken() { Response loginResp = RestAssured.given() .contentType("application/json") .body("{\"username\":\"test\",\"password\":\"123456\"}") .post("/api/login"); return loginResp.jsonPath().getString("data.token"); } // 封装生成公共请求ID的逻辑 public static String generateRequestId() { return String.valueOf(System.currentTimeMillis()); } }
测试中调用工具类
import io.restassured.RestAssured; import static com.example.PreRequestTools.getAuthToken; import static com.example.PreRequestTools.generateRequestId; public class ToolBasedPreRequestTest { public static void main(String[] args) { String token = getAuthToken(); String requestId = generateRequestId(); RestAssured.given() .header("Authorization", "Bearer " + token) .header("X-Request-ID", requestId) .get("/api/protected-resource") .then() .statusCode(200); } }
4. 使用Rest Assured过滤器做全局前置处理
如果需要对所有请求统一添加前置操作(比如统一加请求头、统一签名),可以自定义Filter,在请求发送前自动执行逻辑:
自定义过滤器示例
import io.restassured.filter.Filter; import io.restassured.filter.FilterContext; import io.restassured.response.Response; import io.restassured.specification.FilterableRequestSpecification; import io.restassured.specification.FilterableResponseSpecification; public class GlobalPreRequestFilter implements Filter { @Override public Response filter(FilterableRequestSpecification requestSpec, FilterableResponseSpecification responseSpec, FilterContext ctx) { // 前置逻辑:给所有请求自动加X-Request-ID头 requestSpec.header("X-Request-ID", String.valueOf(System.currentTimeMillis())); // 继续执行后续请求流程 return ctx.next(requestSpec, responseSpec); } }
在测试中使用过滤器
import io.restassured.RestAssured; public class FilterBasedPreRequestTest { public static void main(String[] args) { RestAssured.given() .filter(new GlobalPreRequestFilter()) // 全局前置过滤器 .get("/api/any-endpoint") .then() .statusCode(200); } }
内容的提问来源于stack exchange,提问作者AKshay
相关产品推荐
相关产品推荐

