2. 环境准备:Docker部署PostgreSQL、配置Redis/Memcached作为缓存层、安装测试框架(pytest)

集成测试环境的搭建是验证缓存一致性的基础。本章将指导你通过Docker快速部署PostgreSQL主数据库,配置Redis与Memcached作为缓存层,并安装pytest测试框架,构建一套可复用的本地测试沙箱。

2.1 整体环境架构

下图展示了本次课程所使用的测试环境拓扑结构。所有组件均运行在Docker容器中,通过内部网络互通,测试脚本在宿主机上通过端口映射访问各服务。

集成测试环境架构图 集成测试环境架构图 宿主机 (测试执行) pytest 测试框架 Docker 内部网络 (bridge) PostgreSQL 端口: 5432 Redis (缓存) 端口: 6379 Memcached (缓存) 端口: 11211 说明 测试脚本通过宿主机端口访问各容器服务;Redis与Memcached作为缓存层,与PostgreSQL进行数据交互。 虚线表示缓存与数据库之间的逻辑数据流,实际通过应用层代码驱动。

2.2 Docker部署PostgreSQL

使用Docker官方镜像可以快速启动一个配置干净的PostgreSQL实例,避免本地安装的依赖冲突。以下是部署步骤与关键参数说明。

2.2.1 启动PostgreSQL容器

# 拉取PostgreSQL 15镜像
docker pull postgres:15

# 启动容器
docker run -d \
  --name pg-cache-test \
  -e POSTGRES_USER=testuser \
  -e POSTGRES_PASSWORD=testpass \
  -e POSTGRES_DB=cache_test \
  -p 5432:5432 \
  postgres:15

2.2.2 验证连接

# 使用psql客户端验证
docker exec -it pg-cache-test psql -U testuser -d cache_test -c "SELECT version();"
提示:生产环境中应避免使用弱密码。本课程为本地测试环境,使用简单密码以降低复杂度。若端口5432被占用,可通过修改 -p 5433:5432 映射到其他宿主机端口。

2.3 配置Redis与Memcached缓存层

Redis和Memcached是两种主流的缓存方案,它们在数据结构支持、持久化能力和内存管理策略上存在差异。本课程将同时部署两者,以便在后续章节中对比其缓存一致性表现。

2.3.1 缓存选型对比

特性 Redis Memcached
数据结构 String、Hash、List、Set、Sorted Set等 仅支持Key-Value
持久化 支持RDB/AOF 不支持
内存淘汰策略 8种策略(如LRU、LFU、TTL) LRU
集群模式 原生Cluster、Sentinel 客户端分片
典型应用场景 缓存、会话、排行榜、消息队列 简单缓存、Session存储

2.3.2 启动Redis容器

docker run -d \
  --name redis-cache \
  -p 6379:6379 \
  redis:7-alpine \
  redis-server --requirepass redispwd

2.3.3 启动Memcached容器

docker run -d \
  --name memcached-cache \
  -p 11211:11211 \
  memcached:1.6-alpine \
  memcached -m 64
注意:Memcached默认不开启认证。在本地测试环境中,建议通过Docker网络隔离来保证安全。Redis设置了密码 redispwd,后续测试代码中需要配置该密码进行连接。

2.4 安装pytest测试框架

pytest是Python生态中最流行的测试框架之一,支持fixture、参数化、插件扩展等特性,非常适合编写集成测试用例。本课程使用Python 3.10+版本。

2.4.1 创建虚拟环境并安装依赖

# 创建项目目录
mkdir cache-consistency-test && cd cache-consistency-test

# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 安装pytest及数据库/缓存客户端库
pip install pytest pytest-xdist psycopg2-binary redis pymemcache

2.4.2 验证安装

# 检查pytest版本
pytest --version

# 运行一个简单的测试用例验证环境
pytest -v -k "test_placeholder"

2.4.3 项目结构规划

良好的项目结构有助于测试用例的组织和维护。建议采用以下目录布局:

cache-consistency-test/
├── conftest.py          # pytest全局fixture定义
├── requirements.txt     # 依赖清单
├── docker-compose.yml   # 可选:一键启动所有服务
├── tests/
│   ├── test_basic.py    # 基础连接测试
│   ├── test_cache.py    # 缓存操作测试
│   └── test_consistency.py  # 缓存一致性测试(后续章节)
└── utils/
    ├── db_client.py     # 数据库操作封装
    └── cache_client.py  # 缓存操作封装
关键依赖说明:
  • psycopg2-binary:PostgreSQL的Python驱动,无需编译依赖。
  • redis:Redis官方Python客户端,支持连接池和管道。
  • pymemcache:Memcached的Python客户端,轻量且支持一致性哈希。
  • pytest-xdist:可选插件,用于并行执行测试用例,加速测试反馈。

2.5 环境验证清单

完成上述部署后,建议执行以下验证步骤,确保所有组件正常运行:

验证项 命令/方法 预期结果
PostgreSQL连接 docker exec -it pg-cache-test psql -U testuser -d cache_test -c "\l" 显示数据库列表,包含 cache_test
Redis连接 docker exec -it redis-cache redis-cli -a redispwd ping 返回 PONG
Memcached连接 docker exec -it memcached-cache sh -c "echo stats | nc localhost 11211" 返回统计信息,无连接错误
pytest运行 pytest --collect-only 显示已收集的测试用例列表(至少包含基础测试)

2.6 使用Docker Compose统一管理(可选)

为了简化后续章节中的环境启动与销毁,推荐使用Docker Compose将三个服务统一编排。在项目根目录创建 docker-compose.yml 文件:

version: '3.8'

services:
  postgres:
    image: postgres:15
    container_name: pg-cache-test
    environment:
      POSTGRES_USER: testuser
      POSTGRES_PASSWORD: testpass
      POSTGRES_DB: cache_test
    ports:
      - "5432:5432"
    networks:
      - test-net

  redis:
    image: redis:7-alpine
    container_name: redis-cache
    command: redis-server --requirepass redispwd
    ports:
      - "6379:6379"
    networks:
      - test-net

  memcached:
    image: memcached:1.6-alpine
    container_name: memcached-cache
    command: memcached -m 64
    ports:
      - "11211:11211"
    networks:
      - test-net

networks:
  test-net:
    driver: bridge
# 一键启动所有服务
docker-compose up -d

# 一键停止并清理
docker-compose down
Docker Compose 服务编排图 Docker Compose 服务编排图 docker-compose.yml PostgreSQL 端口: 5432 Redis 端口: 6379 Memcached 端口: 11211 共享网络: test-net (bridge) 三个服务通过Docker内部网络通信,宿主机通过映射端口访问

2.7 环境检查清单

在开始编写测试用例之前,请确认以下条件均已满足:

  • Docker运行中:docker ps 显示三个容器均为 Up 状态。
  • 端口无冲突:宿主机5432、6379、11211端口未被其他进程占用。
  • Python虚拟环境激活:which pytest 指向项目虚拟环境路径。
  • 客户端库可导入:执行 python -c "import psycopg2; import redis; import pymemcache" 无报错。
  • 网络连通性:从宿主机使用对应客户端工具可成功连接各服务。
排障建议:如果容器启动后无法连接,首先检查Docker日志:docker logs <container_name>。常见问题包括端口映射冲突、密码配置错误、内存不足导致Memcached启动失败等。