本文目录导读:

我来详细介绍Java接口测试案例的编写方法,包括多种主流框架和最佳实践。
使用JUnit + HttpClient (基础方法)
添加依赖 (Maven)
<dependencies>
<!-- JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- HttpClient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.14</version>
</dependency>
<!-- JSON处理 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.32</version>
</dependency>
</dependencies>
基础测试类示例
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class ApiTest {
private static final String BASE_URL = "http://api.example.com";
@Test
public void testGetUser() throws Exception {
// 创建HttpClient
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建GET请求
HttpGet httpGet = new HttpGet(BASE_URL + "/api/users/1");
httpGet.setHeader("Content-Type", "application/json");
// 执行请求
HttpResponse response = httpClient.execute(httpGet);
// 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("Status Code: " + statusCode);
// 获取响应体
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println("Response: " + responseBody);
// 解析JSON响应
JSONObject jsonResponse = JSON.parseObject(responseBody);
String username = jsonResponse.getString("username");
// 断言验证
org.junit.Assert.assertEquals(200, statusCode);
org.junit.Assert.assertNotNull(username);
// 关闭连接
httpClient.close();
}
@Test
public void testCreateUser() throws Exception {
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建POST请求
HttpPost httpPost = new HttpPost(BASE_URL + "/api/users");
httpPost.setHeader("Content-Type", "application/json");
// 构建请求体
JSONObject requestBody = new JSONObject();
requestBody.put("username", "testuser");
requestBody.put("email", "test@example.com");
// 设置请求体
StringEntity entity = new StringEntity(requestBody.toJSONString(), "UTF-8");
httpPost.setEntity(entity);
// 执行请求
HttpResponse response = httpClient.execute(httpPost);
// 验证
int statusCode = response.getStatusLine().getStatusCode();
String responseBody = EntityUtils.toString(response.getEntity());
org.junit.Assert.assertEquals(201, statusCode);
JSONObject jsonResponse = JSON.parseObject(responseBody);
org.junit.Assert.assertEquals("testuser", jsonResponse.getString("username"));
httpClient.close();
}
}
使用RestAssured (推荐)
添加依赖
<dependencies>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.8.0</version>
<scope>test</scope>
</dependency>
</dependencies>
RestAssured测试示例
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.util.HashMap;
import java.util.Map;
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
public class RestAssuredApiTest {
@BeforeClass
public void setup() {
RestAssured.baseURI = "http://api.example.com";
RestAssured.basePath = "/api";
}
@Test
public void testGetUser() {
given()
.header("Content-Type", "application/json")
.when()
.get("/users/1")
.then()
.statusCode(200)
.body("username", equalTo("john_doe"))
.body("email", containsString("@example.com"))
.body("id", notNullValue());
}
@Test
public void testCreateUser() {
// 构建请求体
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("username", "newuser");
requestBody.put("email", "new@example.com");
requestBody.put("password", "password123");
given()
.contentType(ContentType.JSON)
.body(requestBody)
.when()
.post("/users")
.then()
.statusCode(201)
.body("username", equalTo("newuser"))
.body("id", greaterThan(0))
.time(lessThan(2000L)); // 响应时间小于2秒
}
@Test
public void testUpdateUser() {
String updateBody = "{\"email\": \"updated@example.com\"}";
given()
.contentType(ContentType.JSON)
.body(updateBody)
.when()
.put("/users/1")
.then()
.statusCode(200)
.body("email", equalTo("updated@example.com"));
}
@Test
public void testDeleteUser() {
given()
.when()
.delete("/users/1")
.then()
.statusCode(204);
}
@Test
public void testLoginWithToken() {
// 获取token
String token = given()
.contentType(ContentType.JSON)
.body("{\"username\":\"admin\",\"password\":\"admin123\"}")
.when()
.post("/auth/login")
.then()
.extract()
.path("token");
// 使用token访问受保护资源
given()
.header("Authorization", "Bearer " + token)
.when()
.get("/protected/users")
.then()
.statusCode(200);
}
}
通用测试框架封装
创建一个更完善的测试框架:
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.HashMap;
import java.util.Map;
import static io.restassured.RestAssured.*;
public class AdvancedApiTest {
private String baseUrl = "http://api.example.com";
private String authToken;
@BeforeClass
public void setup() {
// 获取认证token
authToken = getAuthToken();
// 设置基础配置
baseURI = baseUrl;
basePath = "/api/v1";
}
private String getAuthToken() {
Map<String, String> credentials = new HashMap<>();
credentials.put("username", "test");
credentials.put("password", "test123");
Response response = given()
.contentType("application/json")
.body(credentials)
.when()
.post("/auth/login");
return response.jsonPath().getString("token");
}
private RequestSpecification getAuthenticatedRequest() {
return given()
.header("Authorization", "Bearer " + authToken)
.header("Content-Type", "application/json");
}
@DataProvider(name = "userData")
public Object[][] userData() {
return new Object[][] {
{"user1", "user1@test.com", true},
{"user2", "user2@test.com", false}
};
}
@Test(dataProvider = "userData")
public void testUserCreation(String username, String email, boolean expectedStatus) {
Map<String, Object> user = new HashMap<>();
user.put("username", username);
user.put("email", email);
Response response = getAuthenticatedRequest()
.body(user)
.when()
.post("/users");
if (expectedStatus) {
response.then().statusCode(201);
response.then().body("username", equalTo(username));
} else {
response.then().statusCode(400);
}
}
@Test
public void testUserLifecycle() {
// 创建用户
Map<String, Object> newUser = new HashMap<>();
newUser.put("username", "lifecycle_test");
newUser.put("email", "lifecycle@test.com");
Response createResponse = getAuthenticatedRequest()
.body(newUser)
.when()
.post("/users");
createResponse.then().statusCode(201);
int userId = createResponse.jsonPath().getInt("id");
// 查询用户
getAuthenticatedRequest()
.when()
.get("/users/" + userId)
.then()
.statusCode(200)
.body("username", equalTo("lifecycle_test"));
// 更新用户
Map<String, String> update = new HashMap<>();
update.put("email", "updated@test.com");
getAuthenticatedRequest()
.body(update)
.when()
.put("/users/" + userId)
.then()
.statusCode(200)
.body("email", equalTo("updated@test.com"));
// 删除用户
getAuthenticatedRequest()
.when()
.delete("/users/" + userId)
.then()
.statusCode(204);
// 验证删除
getAuthenticatedRequest()
.when()
.get("/users/" + userId)
.then()
.statusCode(404);
}
@Test
public void testResponseTime() {
// 测试接口响应时间
given()
.header("Authorization", "Bearer " + authToken)
.when()
.get("/users")
.then()
.time(lessThan(5000L)); // 5秒内
}
@Test
public void testErrorHandling() {
// 测试错误处理
given()
.header("Authorization", "Bearer " + authToken)
.when()
.post("/invalid-endpoint")
.then()
.statusCode(404);
// 测试未授权访问
given()
.when()
.get("/users")
.then()
.statusCode(401);
// 测试参数验证
getAuthenticatedRequest()
.body("{\"email\":\"invalid-email\"}")
.when()
.post("/users")
.then()
.statusCode(400);
}
}
测试报告配置
TestNG报告配置 (testng.xml)
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="API Test Suite">
<test name="User API Tests">
<classes>
<class name="RestAssuredApiTest"/>
<class name="AdvancedApiTest"/>
</classes>
</test>
<listeners>
<listener class-name="org.uncommons.reportng.HTMLReporter"/>
<listener class-name="org.uncommons.reportng.JUnitXMLReporter"/>
</listeners>
</suite>
allure报告配置 (推荐)
import io.qameta.allure.*;
import org.testng.annotations.Test;
@Epic("用户管理API")
@Feature("用户CRUD操作")
public class AllureApiTest {
@Test(description = "测试用户创建功能")
@Severity(SeverityLevel.CRITICAL)
@Story("创建新用户")
@Step("创建用户")
public void testCreateUser() {
// 测试代码
}
}
最佳实践建议
- 数据隔离:使用测试数据工厂模式
- 环境配置:使用配置文件管理不同环境
- 断言全面:验证状态码、响应体、响应时间
- 错误处理:测试各种异常情况
- 日志记录:记录请求和响应信息
- 并行测试:使用TestNG并行执行
这就是Java接口测试的完整实践方案,你可以根据项目需求选择合适的框架和技术栈。