聊一聊Java生态接口测试常见的框架
目录
一、快速入门RestAssured + JUnit 5
1. 添加 Maven 依赖
2. 编写测试用例
二、关键功能扩展
1. 参数化测试 (TestNG)
2. 集成 Spring Boot (MockMvc)
3. 模拟外部服务 (WireMock)
在Java生态中,有几个流行的接口测试框架,比如RestAssured、JUnit、TestNG、Spring Test等。其中,RestAssured专门用于RESTful接口的测试,而JUnit和TestNG是单元测试框架,但也可以用于接口测试。Spring Test则是在Spring框架中进行集成测试的工具。
如果项目使用Spring Boot,可以考虑使用Spring Test中的`TestRestTemplate`或`WebTestClient`。
如果更喜欢用纯Java代码且不想依赖太多库,可以使用Java自带的HttpURLConnection或Apache HttpClient,但需要自己封装断言。
一、快速入门RestAssured + JUnit 5
1. 添加 Maven 依赖
<dependencies>
<!-- RestAssured -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>
<!-- JUnit 5 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
</dependencies>
2. 编写测试用例
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
public class ApiTest {
@Test
void testGetUser() {
given() // 请求配置
.baseUri("https://jsonplaceholder.typicode.com")
.queryParam("id", 1)
.when() // 发送请求
.get("/users")
.then() // 验证响应
.statusCode(200)
.body("name[0]", equalTo("Leanne Graham"))
.body("email[0]", containsString("@"));
}
@Test
void testPostUser() {
String jsonBody = """
{
"name": "John Doe",
"email": "john@example.com"
}
""";
given()
.baseUri("https://jsonplaceholder.typicode.com")
.header("Content-Type", "application/json")
.body(jsonBody)
.when()
.post("/users")
.then()
.statusCode(201)
.body("id", notNullValue());
}
}
二、关键功能扩展
1. 参数化测试 (TestNG)
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@Test
public class DataDrivenTest {
@DataProvider
public Object[][] userData() {
return new Object[][] {
{1, "Leanne Graham"},
{2, "Ervin Howell"}
};
}
@Test(dataProvider = "userData")
void testUserById(int userId, String expectedName) {
given()
.pathParam("id", userId)
.when()
.get("https://jsonplaceholder.typicode.com/users/{id}")
.then()
.body("name", equalTo(expectedName));
}
}
2. 集成 Spring Boot (MockMvc)
@SpringBootTest
@AutoConfigureMockMvc
public class SpringApiTest {
@Autowired
private MockMvc mockMvc;
@Test
void testGetUser() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/users/1")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("Leanne Graham"));
}
}
3. 模拟外部服务 (WireMock)
import com.github.tomakehurst.wiremock.WireMockServer;
import static com.github.tomakehurst.wiremock.client.WireMock.*;
@Test
void testWithMockServer() {
WireMockServer wireMock = new WireMockServer(8089);
wireMock.start();
// 配置模拟响应
stubFor(get(urlEqualTo("/mock/user"))
.willReturn(aResponse()
.withHeader("Content-Type", "application/json")
.withBody("{\"name\": \"Mock User\"}")));
// 测试代码调用 localhost:8089/mock/user
// ... (使用 RestAssured 或 HttpClient)
wireMock.stop();
}
根据项目的情况,可以采取以下方式。简单 REST 测试RestAssured + JUnit 5;Spring Boot 项目Spring Test + MockMvc;复杂测试流程TestNG + RestAssured;微服务契约测试Feign + Pact。