我给你一套可直接运行、结构完整、带注释的 TestNG 接口测试方案实现发送 HTTP 接口请求提取接口返回字段连接数据库查询落库数据接口返回值 VS 数据库数据断言对比一、依赖准备Maven pom.xml需要HttpClient发请求、FastJSON/Jackson解析返回、JDBC连数据库、TestNG测试框架xmldependencies !-- TestNG 测试框架 -- dependency groupIdorg.testng/groupId artifactIdtestng/artifactId version7.8.0/version scopetest/scope /dependency !-- HttpClient 发送接口请求 -- dependency groupIdorg.apache.httpcomponents.client5/groupId artifactIdhttpclient5/artifactId version5.2.1/version /dependency !-- FastJSON 解析接口返回 -- dependency groupIdcom.alibaba/groupId artifactIdfastjson2/artifactId version2.0.32/version /dependency !-- MySQL 驱动根据你的数据库替换 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId version8.0.33/version /dependency /dependencies二、完整测试代码直接复制改参数就能用核心流程BeforeClass初始化数据库连接 →Test发接口 → 提取返回 → 查询 DB → 断言 →AfterClass关闭连接java运行import com.alibaba.fastjson2.JSONObject; import org.apache.hc.client5.http.fluent.Request; import org.apache.hc.core5.http.ContentType; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; /** * TestNG 接口测试 数据库断言示例 */ public class ApiDbAssertTest { // 【必须修改为你的配置】 // 数据库配置 private static final String DB_URL jdbc:mysql://localhost:3306/your_db?useSSLfalseserverTimezoneUTC; private static final String DB_USER root; private static final String DB_PASSWORD 123456; // 接口地址 private static final String API_URL http://localhost:8080/api/user/add; // 数据库连接对象 private Connection conn; /** * 测试前初始化数据库连接只执行一次 */ BeforeClass public void initDbConnection() throws Exception { // 加载驱动MySQL8 可省略自动加载 Class.forName(com.mysql.cj.jdbc.Driver); // 获取连接 conn DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD); System.out.println(✅ 数据库连接成功); } /** * 核心测试方法接口请求 提取返回 DB断言 */ Test public void testApiAndDbAssert() throws Exception { // 1. 构造接口请求参数 JSONObject requestParam new JSONObject(); requestParam.put(username, testUser001); requestParam.put(phone, 13800138000); requestParam.put(age, 25); // 2. 发送 POST 请求 String response Request.post(API_URL) .bodyString(requestParam.toJSONString(), ContentType.APPLICATION_JSON) .execute() .returnContent() .asString(); System.out.println( 接口返回 response); // 3. 提取接口返回关键字段 JSONObject respJson JSONObject.parseObject(response); // 假设返回格式{code:200,msg:success,data:{userId:1001,username:testUser001,age:25}} int code respJson.getIntValue(code); String username respJson.getJSONObject(data).getString(username); int userId respJson.getJSONObject(data).getIntValue(userId); int age respJson.getJSONObject(data).getIntValue(age); // 先断言接口本身返回正常 Assert.assertEquals(code, 200, 接口响应码错误); // 4. 根据 userId 查询数据库落库数据 String sql SELECT user_id, username, age FROM t_user WHERE user_id ?; PreparedStatement pst conn.prepareStatement(sql); pst.setInt(1, userId); // 用接口返回的userId作为查询条件 ResultSet rs pst.executeQuery(); // 读取数据库数据 int dbUserId 0; String dbUsername null; int dbAge 0; if (rs.next()) { dbUserId rs.getInt(user_id); dbUsername rs.getString(username); dbAge rs.getInt(age); } // 5. 接口返回值 VS 数据库数据 断言对比 Assert.assertEquals(userId, dbUserId, 用户ID不一致接口返回 userId 数据库 dbUserId); Assert.assertEquals(username, dbUsername, 用户名不一致接口返回 username 数据库 dbUsername); Assert.assertEquals(age, dbAge, 年龄不一致接口返回 age 数据库 dbAge); System.out.println(✅ 接口返回值与数据库数据断言全部通过); } /** * 测试后关闭数据库连接 */ AfterClass public void closeDbConnection() throws Exception { if (conn ! null) { conn.close(); System.out.println(✅ 数据库连接已关闭); } } }三、关键步骤说明新手必看1. 接口返回提取用JSONObject.parseObject()把返回字符串转成 JSON 对象用getIntValue()/getString()提取需要对比的字段提取的字段必须和数据库表字段对应2. 数据库查询用接口返回的唯一标识如 userId、orderId作为 SQL 查询条件确保查到的是同一条数据SQL 只查需要对比的字段提升效率3. 断言对比使用 TestNG 的Assert.assertEquals(expected, actual, message)预期值接口返回值实际值数据库查询结果断言失败会自动打印对比信息方便排查四、适配不同场景GET 请求把Request.post()改成Request.get(API_URL ?参数)即可Oracle/PostgreSQL 数据库替换 pom 里的驱动包修改DB_URL格式和驱动类多字段 / 复杂断言直接多写几行Assert.assertEquals即可五、常见问题数据库连接失败检查 IP、端口、库名、账号密码查不到数据确认接口执行成功、事务已提交、查询条件正确返回值解析失败检查 JSON 层级是否写对总结这套代码实现了接口请求 → 提取返回 → 数据库校验的完整流程用唯一 ID 关联接口和数据库保证对比的是同一条数据TestNG 断言会自动判断结果失败直接输出差异便于定位问题