当前位置: 首页 > news >正文

TestNG + 数据库 + 断言

1. pom.xml 依赖(全覆盖)

xml

<dependencies> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>7.8.0</version> <scope>test</scope> </dependency> <!-- MySQL --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> </dependency> <!-- Oracle --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>21.1.0.0</version> </dependency> <!-- PostgreSQL --> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.6.0</version> </dependency> <!-- SQL Server --> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>12.4.0.jre11</version> </dependency> </dependencies>

2. 数据库连接工具类(你只改这里 4 行)

DBUtil.java

java

运行

import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class DBUtil { // ====================== 你只改这 4 行 ====================== private static final String DB_TYPE = "mysql"; // mysql/oracle/pg/sqlserver private static final String IP = "localhost"; private static final String DB_NAME = "testdb"; private static final String USER = "root"; private static final String PASSWORD = "123456"; // ========================================================== private static String getUrl() { return switch (DB_TYPE) { case "mysql" -> "jdbc:mysql://" + IP + ":3306/" + DB_NAME + "?useSSL=false&serverTimezone=UTC"; case "oracle" -> "jdbc:oracle:thin:@//" + IP + ":1521/" + DB_NAME; case "pg" -> "jdbc:postgresql://" + IP + ":5432/" + DB_NAME; case "sqlserver" -> "jdbc:sqlserver://" + IP + ":1433;databaseName=" + DB_NAME + ";encrypt=false"; default -> throw new RuntimeException("不支持的数据库"); }; } public static Connection getConnection() { try { Connection conn = DriverManager.getConnection(getUrl(), USER, PASSWORD); System.out.println("✅ 数据库连接成功"); return conn; } catch (Exception e) { e.printStackTrace(); return null; } } public static void close(Connection conn, PreparedStatement pstmt, ResultSet rs) { try { if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); System.out.println("✅ 资源已关闭"); } catch (Exception e) { e.printStackTrace(); } } }

3. TestNG 数据库断言测试类(最常用 5 种断言)

DbAssertTest.java

java

运行

import org.testng.Assert; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; public class DbAssertTest { private Connection conn; @BeforeTest public void connect() { conn = DBUtil.getConnection(); } // ====================== 数据库断言(核心) ====================== @Test public void testDataFromDB() { String sql = "SELECT username, age, status FROM user WHERE id=?"; // 改你的SQL try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setInt(1, 1001); // 参数 ResultSet rs = pstmt.executeQuery(); if (rs.next()) { // 1. 相等断言 Assert.assertEquals(rs.getString("username"), "zhangsan", "用户名错误"); // 2. 数字断言 Assert.assertEquals(rs.getInt("age"), 25, "年龄错误"); // 3. 非空断言 Assert.assertNotNull(rs.getString("username"), "用户名不能为空"); // 4. 布尔/状态断言 Assert.assertEquals(rs.getInt("status"), 1, "状态必须为启用"); // 5. 真/假断言 Assert.assertTrue(rs.getInt("age") > 18, "年龄必须大于18"); } else { Assert.fail("❌ 未查询到数据"); } } catch (Exception e) { e.printStackTrace(); Assert.fail("❌ 数据库执行失败:" + e.getMessage()); } } @AfterTest public void close() { DBUtil.close(conn, null, null); } }

http://www.jsqmd.com/news/903096/

相关文章:

  • jenkins 流水线打包
  • 西宁黄金上门回收哪家强?福运来黄金回收专业变现值得托付 - 黄金回收
  • AI行政复议辅助办案系统:让每一起复议都有“数字法理助手”
  • 黎阳之光人员无感技术,开启矿山矿洞安全管理新范式
  • 别再只盯着CVE-2021-36749了,手把手教你用Docker+Burp复现Apache Druid任意文件读取漏洞
  • 华为何庭波:数万人历经七年,铸成‘莫邪干将’剑!
  • 教育部:严查论文重复率!看着室友定稿自己还在挣扎,实测8款AI查重降重工具帮你追赶进度 - 逢君学术-AI论文写作
  • 从雷赛伺服电机选型案例出发:如何把11.9倍的糟糕惯量比优化到5倍以内?
  • Playwright + 三大AI测试智能体实战:从用例生成到自动修复全记录(附可复现命令)
  • TCRT5000红外循迹传感器:从光电原理到Arduino机器人实战
  • 如何一键安装BetterNCM:网易云音乐插件管理终极指南
  • 2026成都环氧自流平包工包料技术全解析与合规推荐 - 优质品牌商家
  • Magpie-LuckyDraw:终极免费开源抽奖系统,全平台高效部署指南
  • DFRobot Devastator坦克机器人套件组装与Arduino控制实战指南
  • 2026年成都系统开发公司技术实力实测盘点:成都软件开发、四川APP开发、四川CRM开发、四川GEO优化、四川UI设计选择指南 - 优质品牌商家
  • 逆向思维:不装证书,用Burpsuite+Proxifier也能抓微信小程序的包?聊聊另一种思路
  • 在持续集成中利用 Taotoken 实现构建日志的智能分析与错误归因
  • Spring Boot配置绑定避坑指南:为什么你的@ConfigurationProperties对Map、List和嵌套对象不生效?
  • 西宁黄金上门回收首选福运来黄金回收,2026年五月行情参考 - 黄金回收
  • 终极英雄联盟工具箱League Akari:LCU API驱动的专业游戏助手完整指南
  • 终极文档下载解决方案:kill-doc让你所见即所得
  • Poppins字体终极指南:免费开源的多语言几何字体解决方案
  • 贵阳黄金上门回收实评,福运来黄金回收高居榜首 - 黄金回收
  • Windows磁盘空间终极管理方案:免费高效的WinDirStat完整指南
  • 从挖掘机到注塑机:手把手拆解液压系统在工业设备中的核心应用与选型要点
  • 衢州黄金上门回收,福运来黄金回收备受信赖之选 - 黄金回收
  • 告别硬编码断言!基于Skills的接口测试,智能体自动组合请求与校验(附代码)
  • 一文讲透|盘点2026年遥遥领先的的降AIGC网站
  • STM32F405外设时钟分配实战指南:你的ADC、TIM、USB时钟到底从哪来?
  • 别再手动清标志位了!STM32F103 DMA通道5配合串口1空闲中断的配置详解与优化