2. 环境准备:Docker部署PostgreSQL、配置Redis/Memcached作为缓存层、安装测试框架(pytest)
集成测试环境的搭建是验证缓存一致性的基础。本章将指导你通过Docker快速部署PostgreSQL主数据库,配置Redis与Memcached作为缓存层,并安装pytest测试框架,构建一套可复用的本地测试沙箱。
2.1 整体环境架构
下图展示了本次课程所使用的测试环境拓扑结构。所有组件均运行在Docker容器中,通过内部网络互通,测试脚本在宿主机上通过端口映射访问各服务。
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
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启动失败等。