如何为测试(单元/集成测试)创建可快速销毁的临时PostgreSQL数据库
创建用于测试的临时PostgreSQL数据库(可快速销毁)
以下是完全独立、无需依赖现有PostgreSQL服务、测试后可彻底清理的临时数据库创建方案:
步骤1:生成临时工作目录
先用mktemp创建一个唯一的临时目录,用来存放数据库的所有数据、配置和日志,避免和系统其他内容冲突:
TEMP_PG_DIR=$(mktemp -d)
步骤2:初始化独立数据库实例
用initdb初始化一个全新的数据库实例,指定临时目录作为数据存储位置,同时设置测试用的超级用户和免密登录(方便测试操作):
initdb -D "$TEMP_PG_DIR" -U test_user -A trust
步骤3:配置实例的隔离性
编辑临时目录下的postgresql.conf,强制仅本地监听,指定非默认端口(比如5433),彻底避免和系统中可能存在的PostgreSQL服务冲突:
echo "listen_addresses = 'localhost'" >> "$TEMP_PG_DIR/postgresql.conf" echo "port = 5433" >> "$TEMP_PG_DIR/postgresql.conf" echo "log_directory = '.' " >> "$TEMP_PG_DIR/postgresql.conf"
步骤4:启动临时数据库实例
用pg_ctl启动这个独立的实例,日志也存到临时目录里:
pg_ctl -D "$TEMP_PG_DIR" -l "$TEMP_PG_DIR/postgres.log" start
可以用下面的命令测试连接是否成功:
psql -h localhost -p 5433 -U test_user -c "SELECT version();"
步骤5:创建测试专用数据库
现在可以创建专门给测试用的数据库:
createdb -h localhost -p 5433 -U test_user test_db
接下来直接在test_db上运行你的单元或集成测试即可。
步骤6:测试完成后彻底销毁
测试结束后,先停止数据库实例,再删除整个临时目录,所有数据会被彻底清理:
pg_ctl -D "$TEMP_PG_DIR" stop rm -rf "$TEMP_PG_DIR"
一键脚本简化操作
把上面的步骤整合成脚本,一键完成创建、等待测试、销毁的流程:
#!/bin/bash # 创建临时目录 TEMP_PG_DIR=$(mktemp -d) echo "临时数据库目录已创建: $TEMP_PG_DIR" # 初始化实例 initdb -D "$TEMP_PG_DIR" -U test_user -A trust # 配置隔离参数 echo "listen_addresses = 'localhost'" >> "$TEMP_PG_DIR/postgresql.conf" echo "port = 5433" >> "$TEMP_PG_DIR/postgresql.conf" # 启动实例 pg_ctl -D "$TEMP_PG_DIR" -l "$TEMP_PG_DIR/postgres.log" start echo "等待数据库启动..." sleep 3 # 创建测试库 createdb -h localhost -p 5433 -U test_user test_db echo "测试数据库 test_db 已就绪,可开始执行测试" # 等待用户确认测试完成 read -p "测试结束后按回车键销毁临时数据库..." # 停止实例并清理所有文件 pg_ctl -D "$TEMP_PG_DIR" stop rm -rf "$TEMP_PG_DIR" echo "临时数据库已彻底销毁"
给脚本加执行权限后直接运行:
chmod +x temp_pg_test.sh ./temp_pg_test.sh
内容的提问来源于stack exchange,提问作者Flow
相关产品推荐
相关产品推荐

