Java接口测试案例如何编写

wen java案例 25

本文目录导读:

Java接口测试案例如何编写

  1. 使用JUnit + HttpClient (基础方法)
  2. 使用RestAssured (推荐)
  3. 通用测试框架封装
  4. 测试报告配置
  5. 最佳实践建议

我来详细介绍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() {
        // 测试代码
    }
}

最佳实践建议

  1. 数据隔离:使用测试数据工厂模式
  2. 环境配置:使用配置文件管理不同环境
  3. 断言全面:验证状态码、响应体、响应时间
  4. 错误处理:测试各种异常情况
  5. 日志记录:记录请求和响应信息
  6. 并行测试:使用TestNG并行执行

这就是Java接口测试的完整实践方案,你可以根据项目需求选择合适的框架和技术栈。

抱歉,评论功能暂时关闭!