REST Assured
rest-assured;API 测试 DSL。
30 分钟
REST Assured
JUnit 断言 statusCode() 可读性差;REST Assured 提供 Given-When-Then DSL,让 HTTP 测试像写英语句子。本课为 jev-javalin / spring-boot-essentials 的 Controller 测试打样,并衔接 java-core-essentials 的 JUnit 5。
学习目标
- 用 REST Assured 发送 GET/POST 并断言状态码、Header 与 JSON body
- 提取 JSON 字段做链式断言与后续步骤参数化
- 在 Spring Boot 测试中启动随机端口并复用
@LocalServerPort
基本 DSL
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
@Test
void shouldReturnBookWhenExists() {
given()
.baseUri("http://localhost:7000")
.pathParam("isbn", "978-0134685991")
.when()
.get("/api/books/{isbn}")
.then()
.statusCode(200)
.body("isbn", equalTo("978-0134685991"))
.body("title", not(emptyString()));
}
Given 设上下文,When 发请求,Then 断言——与 BDD 场景一致。
JSON 与 Hamcrest 匹配
given()
.contentType("application/json")
.body("""
{"isbn":"978-0321356680","title":"Effective Java"}
""")
.when()
.post("/api/books")
.then()
.statusCode(201)
.body("id", greaterThan(0));
复杂结构可用 jsonPath():
String title = get("/api/books")
.then()
.extract()
.jsonPath()
.getString("find { it.isbn == '978-0134685991' }.title");
Spring Boot 集成测试
@SpringBootTest(webEnvironment = RANDOM_PORT)
class BookApiIT {
@LocalServerPort
int port;
@BeforeEach
void baseUri() {
RestAssured.port = port;
}
@Test
void createAndFetch() {
String isbn = "978-0134685991";
given().body(Map.of("isbn", isbn, "title", "Clean Code"))
.contentType(JSON)
.when()
.post("/api/books")
.then()
.statusCode(201);
get("/api/books/{isbn}", isbn)
.then()
.body("title", equalTo("Clean Code"));
}
}
无需启动 Postman;CI 里 mvn test 即可回归 API。