测试驱动开发:用 Docker 搭建 deno-postgres 三种认证模式测试环境
测试驱动开发:用 Docker 搭建 deno-postgres 三种认证模式测试环境
【免费下载链接】postgresPostgreSQL driver for Deno项目地址: https://gitcode.com/gh_mirrors/postgr/postgres
deno-postgres 是 Deno 生态中最流行的 PostgreSQL 驱动(PostgreSQL driver for Deno)。做测试驱动开发(TDD)时,最头疼的不是写断言,而是准备一个稳定、可复现、覆盖各种认证方式的数据库测试环境。好消息是,deno-postgres 项目自带一套完整的 Docker 测试环境,一条命令就能同时启动clear、md5、scram-sha-256三种 PostgreSQL 认证模式的服务并自动跑完全部测试。本文带你完整搭建并理解这套环境,让你从零开始也能为 deno-postgres 贡献代码或复现认证问题。
为什么测试驱动开发需要三种认证模式
PostgreSQL 的客户端认证(pg_hba.conf)经历了多代演变,驱动必须逐一兼容:
| 认证模式 | 安全性 | 说明 |
|---|---|---|
| clear(password) | ⚠️ 明文传输 | 仅存在于 PostgreSQL 9 及更早版本,早已移除 |
| md5 | 中等 | 传统加密方式,至今仍有大量老系统使用 |
| scram-sha-256 | ✅ 最强 | 现代 PostgreSQL 默认认证,基于挑战-响应机制 |
如果只测默认的 scram,就可能在 md5 或明文模式下翻车。deno-postgres 的测试正是针对这三种模式分别设计了独立的数据库实例,这就是 docker-compose.yml 里出现三个 PostgreSQL 服务的原因。
一眼看懂 deno-postgres 自带的测试环境
项目根目录的 docker-compose.yml 定义了完整的测试矩阵:
| 服务名 | 镜像版本 | 认证模式 | 端口 |
|---|---|---|---|
postgres_clear | postgres:9 | 明文 password | 6000 |
postgres_md5 | postgres:14 | md5 | 6001 |
postgres_scram | postgres:14 | scram-sha-256 | 6002 |
每个服务的配置都放在独立的目录里,例如 docker/postgres_scram/data/ 下就有pg_hba.conf(认证规则)、postgresql.conf(服务配置)、server.crt和server.key(TLS 证书)。这些测试用的 TLS 证书由 docker/generate_tls_keys.sh 生成,用于验证 SSL 连接场景。
一键搭建:最快配置方法
无需手工改任何配置,克隆仓库后两条命令搞定:
git clone https://gitcode.com/gh_mirrors/postgr/postgres cd postgres docker compose build --no-cache docker compose run testsdocker compose run tests会自动完成三件事:✅ 启动三个数据库容器 → ✅ 等待端口就绪(WAIT_HOSTS)→ ✅ 在容器内执行deno test -A --parallel --check跑完整套测试。整个过程完全自动化,这正是测试驱动开发想要的"可重复"环境。
三种认证模式背后的配置细节
scram-sha-256 的认证规则(pg_hba.conf)同时覆盖了 SSL 与非 SSL 连接:
hostssl postgres scram 0.0.0.0/0 scram-sha-256 hostnossl postgres scram 0.0.0.0/0 scram-sha-256md5 模式(pg_hba.conf)则混合了 md5 与 scram 用户,专门测试两种加密并存的情况。而clear 模式(pg_hba.conf)使用password认证,验证老版本 PostgreSQL 的兼容性。
数据库初始化时,initialize_test_server.sql 会创建scram、md5、clear、socket等专用测试用户,密码统一为postgres。md5 版本甚至通过UPDATE PG_AUTHID强制把密码改写成 md5 格式——这些细节都是为了让认证测试覆盖到真实的边界情况。
把测试跑起来:本地运行与 Docker 运行
Docker 是推荐方式,但如果你本机已装了 PostgreSQL,也可以直接运行:
deno test --allow-read --allow-net --allow-env测试用例集中在 tests/ 目录:认证相关逻辑在 tests/auth_test.ts,连接与连接参数测试在 tests/connection_test.ts 和 tests/connection_params_test.ts,数据编码解码则在 tests/data_types_test.ts 等文件中。具体运行说明可参考 tests/README.md。
不只是认证:事务隔离级别也值得关注
除认证之外,deno-postgres 对 PostgreSQL 事务隔离级别的支持同样完善。项目文档中的这张对比图直观展示了read committed、repeatable read、serializable三种隔离级别在防脏读、防不可重复读、防幻读等方面的差异,写事务相关测试前值得先看一遍:
常见问题与调试技巧
- 端口被占用:三个服务固定使用 6000/6001/6002 端口,冲突时先
docker compose stop清理。 - 等待初始化:
WAIT_AFTER_HOSTS: "15"表示数据库上线后还要等 15 秒让元数据初始化完成,测试失败时先确认这步是否走完。 - TLS 证书过期:本地重新运行 docker/generate_tls_keys.sh 即可重新生成。
小结
用 Docker 搭建 deno-postgres 三种认证模式测试环境,本质上就是把"环境搭建"从手工操作变成可复现的声明式配置。一次docker compose run tests,三种认证模式、SSL 连接、socket 连接全部覆盖,测试驱动开发的循环因此变得又快又稳。如果你正准备为 deno-postgres 提交认证相关的代码或修复,这套现成的环境就是你最好的起点。🚀
【免费下载链接】postgresPostgreSQL driver for Deno项目地址: https://gitcode.com/gh_mirrors/postgr/postgres
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
