3. 数据库选型与版本:MySQL/PostgreSQL 版本选择、兼容性要求、驱动配置

在 Testing 环境中,数据库选型直接影响回归冒烟的执行效率与结果可靠性。本章节聚焦 MySQL 与 PostgreSQL 的版本选择原则、兼容性约束以及驱动配置规范,确保测试环境与生产环境在语义层面保持一致,同时避免因版本差异导致的冒烟误报。

3.1 版本选择原则

Testing 环境应优先选用与生产环境大版本一致的数据库发行版。若生产环境使用 MySQL 8.0,Testing 环境不得降级至 MySQL 5.7,否则可能因 SQL 语法、索引优化器或字符集行为差异导致冒烟通过但生产失败。

数据库 推荐 Testing 版本 生产版本参考 关键兼容性风险
MySQL 8.0.28+ / 8.4 LTS 8.0.x / 8.4.x utf8mb4 默认排序规则、窗口函数支持、CTE 递归限制
PostgreSQL 15.x / 16.x 15.x / 16.x 分区表语法、JSONB 操作符、逻辑复制槽行为
版本锁定策略: 在 docker-compose.yml 或 Helm values 中显式指定数据库镜像的完整版本标签(如 mysql:8.0.36),避免使用 latest 标签。每次生产版本升级后,Testing 环境应在 1 个工作日内同步大版本。

3.2 兼容性要求矩阵

回归冒烟场景中,数据库兼容性需覆盖以下四个维度:

  1. SQL 方言兼容:避免使用 MySQL 专有语法(如 GROUP_CONCAT 默认排序)在 PostgreSQL 上执行。
  2. 数据类型映射:确保 JSON、ARRAY、ENUM 等类型在驱动层正确转换。
  3. 事务隔离级别:Testing 环境默认使用 READ COMMITTED,与生产保持一致。
  4. 字符集与排序规则:统一使用 utf8mb4(MySQL)或 UTF8(PostgreSQL)。
数据库兼容性验证维度 回归冒烟兼容性 SQL 方言兼容 数据类型映射 事务隔离级别 字符集与排序 验证要点 • 使用 ORM 框架时,检查自动生成的 SQL 是否包含方言特定函数 • 对 JSON/ARRAY 字段执行读写测试,确认驱动序列化/反序列化正确 • 在冒烟脚本中显式设置隔离级别:SET TRANSACTION ISOLATION LEVEL READ COMMITTED

3.3 驱动配置规范

驱动版本必须与数据库大版本匹配,且优先使用官方维护的 JDBC / ODBC / Python 驱动。以下为 Testing 环境常用驱动配置清单:

语言/框架 数据库 推荐驱动 版本约束
Java (Spring Boot) MySQL mysql-connector-j ≥ 8.0.33,兼容 MySQL 8.0/8.4
Java (Spring Boot) PostgreSQL postgresql (org.postgresql) ≥ 42.6.0,支持 PG 15/16
Python (Django) MySQL mysqlclient / pymysql mysqlclient ≥ 2.2.0
Python (Django) PostgreSQL psycopg2 / psycopg3 psycopg2 ≥ 2.9.9
Go MySQL go-sql-driver/mysql ≥ 1.7.1
Go PostgreSQL pgx / lib/pq pgx ≥ 5.5.0
驱动配置示例(Spring Boot application-testing.yml):
spring:
  datasource:
    url: jdbc:mysql://testing-db:3306/regression_db?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=utf8mb4
    username: test_user
    password: ${DB_PASSWORD}
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      maximum-pool-size: 10
      minimum-idle: 2
      connection-timeout: 5000

3.4 连接参数与 SSL 配置

Testing 环境通常关闭 SSL 以降低延迟,但需在连接字符串中显式声明。以下为关键连接参数对比:

参数 MySQL 示例 PostgreSQL 示例 说明
SSL 模式 useSSL=false sslmode=disable Testing 环境禁用,生产强制启用
字符集 characterEncoding=utf8mb4 client_encoding=UTF8 避免中文乱码
时区 serverTimezone=UTC TimeZone=UTC 统一使用 UTC,避免夏令时问题
连接超时 connectTimeout=5000 connectTimeout=5 单位:毫秒(MySQL)/ 秒(PG)
常见陷阱: PostgreSQL 的 connectTimeout 单位是秒,而 MySQL 是毫秒。在配置连接池时务必区分单位,否则可能导致冒烟脚本因超时设置过短而误判为数据库不可用。

3.5 多数据库并行测试策略

当回归冒烟需要同时覆盖 MySQL 与 PostgreSQL 时,建议采用数据源路由模式,而非硬编码切换连接。以下为推荐的架构示意:

Testing 环境多数据源路由架构 回归冒烟引擎 数据源路由层 MySQL 8.0 Testing PostgreSQL 16 Testing 路由策略:通过 @DatabaseType 注解或配置中心动态切换数据源,冒烟用例无需修改 SQL

3.6 版本兼容性自检清单

在每次冒烟执行前,建议运行以下自检脚本,确保数据库环境符合预期:

-- MySQL 版本与字符集检查
SELECT VERSION() AS db_version,
       @@character_set_database AS charset,
       @@collation_database AS collation;

-- PostgreSQL 版本与编码检查
SELECT version() AS db_version,
       pg_encoding_to_char(encoding) AS encoding,
       datcollate AS collation
FROM pg_database
WHERE datname = current_database();
自动化建议: 将版本自检集成到冒烟前置脚本中,若检测到版本不匹配则直接中止执行并输出告警。可使用 assert 或 exit code 1 阻断流水线,避免在错误环境中浪费计算资源。