↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本。 PostgreSQL 9.5 已结束支持。 2021-02-11. 请参阅 当前版本手册.

第 30 章 回归测试

回归测试是针对PostgreSQL中 SQL 实现的一套全面测试。它们既测试标准 SQL 操作,也测试 PostgreSQL的扩展能力。

30.1. 运行测试 #

回归测试既可以针对已经安装并正在运行的服务器执行,也可以在构建树中使用临时安装来执行。此外,运行测试时还有“parallel”和 “sequential”两种模式。顺序方式一次只运行一个测试脚本,而并行方式会启动多个服务器进程,以并行方式运行一组测试。并行测试能进一步确认进程间通信和锁定机制是否正常工作。

30.1.1. 针对临时安装运行测试

要在构建完成后、安装之前运行并行回归测试,请输入:

make check

运行位置为顶层目录。(也可以切换到src/test/regress并在那里运行此命令。)结束时,应该会看到类似下面的结果:

=======================
 All 115 tests passed.
=======================

否则会显示哪些测试失败的说明。请参阅第 30.2 节中的下文说明,不要过早认定一次“失败”就意味着存在严重问题。

由于这种测试方法会运行一个临时服务器,如果你以 root 用户身份进行构建,它将无法工作,因为服务器不会以 root 身份启动。推荐做法是不要以 root 身份构建;否则应在安装完成后再执行测试。

如果你把PostgreSQL配置为安装到某个已经存在旧版 PostgreSQL安装的位置,并且在安装新版本之前执行 make check,可能会发现测试失败,因为新程序会尝试使用已安装的共享库。(典型症状是报出未定义符号。)如果你希望在覆盖旧安装之前运行测试,就需要使用configure --disable-rpath 进行构建。不过,不建议在最终安装时使用这个选项。

并行回归测试会在你的用户 ID 下启动相当多的进程。目前最大并发度为二十个并行测试脚本,也就是四十个进程:每个测试脚本都有一个服务器进程和一个 psql进程。因此,如果你的系统对每个用户可创建的进程数施加限制,请确保该限制至少有五十个左右,否则并行测试中可能会出现看似随机的失败。如果无法提高该限制,可以通过设置MAX_CONNECTIONS 参数来降低并行度。例如:

make MAX_CONNECTIONS=10 check

这样一次最多只会并发运行十个测试。

30.1.2. 针对现有安装运行测试

要在安装之后运行测试(见第 15 章),请初始化一个数据区域并启动服务器,具体说明见第 17 章,然后输入:

make installcheck

或者,要并行测试:

make installcheck-parallel

测试默认通过本地主机和默认端口号连接服务器,除非通过PGHOST和PGPORT环境变量另行指定。测试将在名为regression的数据库中运行;任何现有的同名数据库都会被删除。这些测试还会临时创建名为 regressuserN 的用户身份。

30.1.3. 附加测试套件

make check 和 make installcheck 命令只运行“核心”回归测试,这些测试用于检验 PostgreSQL 服务器的内置功能。源码发行版还包含其他测试套件,其中大部分与附加功能有关,例如可选的过程语言。

要运行适用于已选定构建模块的全部测试套件(包括核心测试),请在构建树顶层输入下列命令之一:

make check-world
make installcheck-world

这些命令分别使用临时服务器或已安装的服务器运行测试,与前面对make check和make installcheck的说明相同。其他注意事项也与前面对各个方法的说明相同。注意,make check-world会为每个被测试的模块构建一个独立的临时安装树,因此需要多得多的时间和磁盘空间,相比之下耗用较少的是make installcheck-world。

或者,也可以在构建树相应的子目录中执行make check 或make installcheck来运行单个测试套件。请记住,make installcheck假定你已经安装了相关模块,而不仅仅是核心服务器。

可以按这种方式调用的附加测试包括:

  • 可选过程语言的回归测试(PL/pgSQL 除外,它由核心测试负责)。这些测试位于 src/pl 下。

  • contrib模块的回归测试,位于 contrib下。并非所有contrib 模块都有测试。

  • ECPG 接口库的回归测试,位于 src/interfaces/ecpg/test。

  • 针对并发会话行为的压力测试,位于src/test/isolation。

  • 客户端程序的测试,位于 src/bin 下。另见第 30.4 节。

使用 installcheck 模式时,这些测试会销毁任何名为 pl_regression、contrib_regression、isolationtest、regress1 或 connectdb 的现有数据库,以及名为 regression 的现有数据库。

30.1.4. 区域设置和编码

默认情况下,使用临时安装的测试会采用当前环境中定义的区域设置,以及由 initdb决定的相应数据库编码。通过设置适当的环境变量来测试不同的区域设置可能很有用,例如:

make check LANG=C
make check LC_COLLATE=en_US.utf8 LC_CTYPE=fr_CA.utf8

出于实现原因,设置LC_ALL不能用于此目的;其他所有与区域设置相关的环境变量都可以。

在针对现有安装测试时,区域设置由现有数据库集簇决定,不能为测试单独设置。

也可以通过设置变量ENCODING来显式选择数据库编码,例如:

make check LANG=C ENCODING=EUC_JP

只有在区域设置为 C 时,这样设置数据库编码通常才有意义;否则编码会从区域设置自动选择,而指定与区域设置不匹配的编码会导致错误。

无论是针对临时安装还是现有安装测试,都可以设置数据库编码;不过在后一种情况下,它必须与该安装的区域设置兼容。

30.1.5. 额外测试

核心回归测试套件包含几个默认不运行的测试文件,因为它们可能依赖于平台,或者运行时间很长。可以通过设置以下变量来运行这些或其他额外的测试文件:EXTRA_TESTS。例如,要运行numeric_big测试:

make check EXTRA_TESTS=numeric_big

要运行排序规则测试:

make check EXTRA_TESTS=collate.linux.utf8 LANG=en_US.utf8

其中,collate.linux.utf8测试仅适用于 Linux/glibc 平台,且只有在使用 UTF-8 编码的数据库中运行时才会成功。

30.1.6. 测试热备

源代码分发包中还包含针对热备静态行为的回归测试。这些测试需要一个正在运行的主库和一个正在运行的备库,备库正在从主库接收新的 WAL 更改(使用基于文件的日志传送或流复制均可)。这些服务器不会自动创建,复制的设置也不在此处文档说明。请查阅文档中有关所需命令和相关问题的各个章节。

要运行热备测试,首先在主库上创建一个名为regression 的数据库:

psql -h primary -c "CREATE DATABASE regression"

接下来,在主库上的 regression 数据库中运行准备脚本 src/test/regress/sql/hs_primary_setup.sql,例如:

psql -h primary -f src/test/regress/sql/hs_primary_setup.sql regression

等待这些更改传播到备库。

现在将默认数据库连接指向要测试的备库(例如,设置 PGHOST和PGPORT 环境变量)。最后,在回归测试目录中运行 make standbycheck:

cd src/test/regress
make standbycheck

还可以使用脚本 src/test/regress/sql/hs_primary_extremes.sql 在主库上生成一些极端行为,以测试备库的行为。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.