Docker缓存服务回归冒烟:日志收集与错误排查工程 - 第4节

回归冒烟测试策略:回归测试与冒烟测试的区别

在缓存服务的交付流水线中,回归测试与冒烟测试承担着不同层级的质量保障职责。理解二者的本质区别,是设计高效测试策略的前提。

维度 回归测试 (Regression Test) 冒烟测试 (Smoke Test)
目标 验证代码变更未破坏已有功能 验证核心功能可运行,构建是否可测
执行时机 代码合并后、发布前 构建完成后、回归测试前
覆盖范围 全量或大部分功能模块 仅覆盖核心链路与关键接口
执行时间 分钟级 ~ 小时级 秒级 ~ 分钟级
失败影响 阻断发布,需定位具体缺陷 直接拒绝构建,不进入后续测试
维护成本 高,随功能迭代持续增长 低,用例数量少且稳定
工程实践要点:冒烟测试是回归测试的"守门员"。若冒烟失败,整个回归套件无需执行,直接回退构建。这在大规模缓存集群的 CI/CD 流水线中可节省 70% 以上的等待时间。

缓存服务的冒烟测试用例设计原则

针对 Docker 化缓存服务(如 Redis、Memcached、本地缓存代理),冒烟测试用例必须遵循 快速、核心、稳定 三大原则。

原则一:快速(Fast)

  • 单用例执行时间 ≤ 3 秒,整个冒烟套件 ≤ 30 秒。
  • 避免依赖外部服务(如数据库、消息队列),仅测试缓存自身能力。
  • 使用 docker exec 或 SDK 客户端直连容器端口,不经过负载均衡或网关。

原则二:核心(Core)

  • 只覆盖缓存服务的 CRUD 基础操作:SET、GET、DELETE、EXPIRE。
  • 验证 连接建立与认证:TCP 端口可达、密码认证通过。
  • 验证 内存分配与驱逐策略:写入少量数据后检查内存使用是否在预期范围。

原则三:稳定(Stable)

  • 用例不依赖特定数据状态,每次运行前清理测试 Key。
  • 使用 幂等操作:重复执行结果一致,不产生副作用。
  • 对超时和连接异常做 重试 1 次,避免网络抖动导致误报。
设计建议:将冒烟测试用例与回归测试用例放在同一仓库的不同目录(如 smoke/ 与 regression/),通过 CI 标签或文件名后缀区分执行阶段。

冒烟测试用例清单(缓存服务示例)

用例编号 测试场景 预期结果 执行时间
SMK-01 TCP 端口连通性 telnet 或 nc 连接成功 < 1s
SMK-02 SET 字符串 Key 返回 OK < 1s
SMK-03 GET 已存在的 Key 返回对应 Value < 1s
SMK-04 DELETE 已存在的 Key 返回 1(删除成功) < 1s
SMK-05 EXPIRE 设置 TTL 返回 1,TTL 查询 > 0 < 2s
SMK-06 内存使用检查 used_memory < maxmemory < 2s

冒烟测试执行流程

下图展示了从构建完成到冒烟测试决策的完整流程,以及失败后的快速回退机制。

缓存服务冒烟测试执行流程 Docker 构建完成 启动容器实例 执行冒烟测试套件 全部通过 存在失败用例 进入回归测试阶段 回退构建 / 通知 SRE 说明:冒烟失败直接回退,不执行回归测试,避免浪费 CI 资源

冒烟测试与回归测试的协作关系

在 CI/CD 流水线中,冒烟测试与回归测试形成 两阶段门禁。冒烟测试作为第一道门,过滤掉明显不可用的构建;回归测试作为第二道门,确保功能完整性。

冒烟测试与回归测试协作关系 代码提交 / PR 冒烟测试(快速) 回归测试(全量) 冒烟失败 → 回退构建 回归失败 → 修复后重跑 全部通过 → 发布就绪 冒烟测试失败不进入回归阶段,直接阻断流水线,节省 CI 资源
常见陷阱:不要将冒烟测试用例设计得过于复杂。例如,测试缓存集群的主从同步或持久化 RDB 加载,这些应归入回归测试。冒烟测试只验证"容器启动后能否正常读写"这一基本事实。

冒烟测试代码示例(Redis 缓存)

以下是一个基于 Python 的冒烟测试脚本片段,符合快速、核心、稳定原则:

import redis
import time

def test_smoke_redis():
    # 连接容器内的 Redis(端口映射到宿主机 6379)
    client = redis.Redis(host='localhost', port=6379, db=0, socket_timeout=2)

    # 清理测试 Key(幂等)
    client.delete('smoke:test')

    # SMK-02: SET
    assert client.set('smoke:test', 'hello_smoke') == True

    # SMK-03: GET
    assert client.get('smoke:test') == b'hello_smoke'

    # SMK-04: DELETE
    assert client.delete('smoke:test') == 1

    # SMK-05: EXPIRE
    client.set('smoke:ttl', 'temp')
    assert client.expire('smoke:ttl', 10) == True
    ttl = client.ttl('smoke:ttl')
    assert 0 < ttl <= 10

    # SMK-06: 内存检查
    info = client.info('memory')
    assert info['used_memory'] < info['maxmemory']

    print("[PASS] Redis 冒烟测试全部通过")
工程建议:将冒烟测试脚本打包为 Docker 镜像,在 CI 中通过 docker run --network=host 执行,避免端口映射冲突。同时设置 --timeout 30 确保整体执行时间可控。