2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不再支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 7.3 / 7.2

31.1. 运行测试 #

回归测试可以在已安装并正在运行的服务器上运行,也可以在构建树中的临时安装上运行。此外,还有用于运行测试的“并行”和“顺序”模式。顺序方法单独运行每个测试脚本,而并行方法启动多个服务器进程以并行运行测试组。并行测试增加了对进程间通信和锁是否正常工作的信心。在“并行”模式下,一些测试也可能按顺序运行,以防测试需要如此。

31.1.1. 运行临时安装的测试 #

在构建但未安装后,要运行并行回归测试,请键入

make check

在顶层目录中。(或者您可以切换到 src/test/regress 目录并在此处运行命令。) 以“+”为前缀的测试是在并行模式下运行的,而以“-”为前缀的测试是顺序运行的。最后,您应该会看到类似以下内容:


# All 213 tests passed.

或者关于哪些测试失败的说明。在假设“失败”代表严重问题之前,请参阅下面的 第 31.2 节

由于此测试方法运行一个临时服务器,因此如果您以 root 用户进行构建,它将无法正常工作,因为服务器将无法以 root 用户身份启动。建议的程序是不以 root 用户进行构建,或者在完成安装后执行测试。

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

并行回归测试会在您的用户 ID 下启动大量进程。目前,最大并发度是二十个并行测试脚本,这意味着四十个进程:每个测试脚本都有一个服务器进程和一个 psql 进程。因此,如果您的系统对每个用户的进程数量有限制,请确保此限制至少为五十个左右,否则您可能会在并行测试中遇到随机的失败。如果您无法提高此限制,可以通过设置 MAX_CONNECTIONS 参数来降低并行度。例如:

make MAX_CONNECTIONS=10 check

最多同时运行十个测试。

31.1.2. 运行已安装服务器的测试 #

安装后运行测试(参见 第 17 章),请按照 第 18 章 中的说明初始化一个数据目录并启动服务器,然后键入

make installcheck

或者对于并行测试

make installcheck-parallel

除非由 PGHOSTPGPORT 环境变量另行指示,否则测试将期望在本地主机和默认端口号上连接到服务器。测试将在名为 regression 的数据库中运行;任何同名的现有数据库都将被删除。

测试还将暂时创建一些集群范围的对象,例如角色、表空间和订阅。这些对象的名称将以 regress_ 开头。在使用 installcheck 模式时,请注意避免使用任何名称以此开头的实际全局对象的安装。

31.1.3. 其他测试套件 #

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

要运行适用于已选择构建的模块的所有测试套件,包括核心测试,请在构建树的顶部键入以下命令之一:

make check-world
make installcheck-world

这些命令分别使用临时服务器或已安装的服务器运行测试,正如前面为 make checkmake installcheck 所解释的。其他注意事项与前面为每种方法解释的相同。请注意,make check-world 为每个被测试的模块构建一个单独的实例(临时数据目录),因此它比 make installcheck-world 需要更多的时间和磁盘空间。

在一台现代的多核机器上,如果没有严格的操作系统限制,您可以通过并行化大大加快速度。大多数 PostgreSQL 开发者实际使用的运行所有测试的配方是这样的:

make check-world -j8 >/dev/null

其中 -j 限制接近或略多于可用核心数。丢弃 stdout 消除了当您只想验证成功时无关紧要的噪音。(如果失败,stderr 消息通常足以确定在哪里进一步查看)。

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

可以通过这种方式调用的其他测试包括:

  • 可选过程语言的回归测试。这些位于 src/pl 下。

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

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

  • 核心支持的认证方法的测试,位于 src/test/authentication。(有关其他与认证相关的测试,请参见下文)。

  • 测试并发会话行为的测试,位于 src/test/isolation

  • 崩溃恢复和物理复制的测试,位于 src/test/recovery

  • 逻辑复制的测试,位于 src/test/subscription

  • 客户端程序的测试,位于 src/bin 下。

在使用 installcheck 模式时,这些测试将创建和销毁包含 regression 的测试数据库名称,例如 pl_regressioncontrib_regression。在使用 installcheck 模式时,请注意避免使用任何名称以此开头的非测试数据库的安装。

其中一些辅助测试套件使用 第 31.4 节 中解释的 TAP 基础设施。基于 TAP 的测试仅在 PostgreSQL 使用 --enable-tap-tests 选项配置时运行。这对于开发来说是推荐的,但如果没有合适的 Perl 安装,可以省略。

一些测试套件默认不运行,因为它们在多用户系统上运行不安全,或者它们需要特殊的软件,或者它们是资源密集型的。您可以通过设置 make 或环境变量 PG_TEST_EXTRA 为一个由空格分隔的列表来决定要运行哪些其他测试套件,例如:

make check-world PG_TEST_EXTRA='kerberos ldap ssl load_balance libpq_encryption'

当前支持以下值:

kerberos

src/test/kerberos 下运行测试套件。这需要 MIT Kerberos 安装并打开 TCP/IP 监听套接字。

ldap

src/test/ldap 下运行测试套件。这需要 OpenLDAP 安装并打开 TCP/IP 监听套接字。

libpq_encryption

运行测试 src/interfaces/libpq/t/005_negotiate_encryption.pl。这会打开 TCP/IP 监听套接字。如果 PG_TEST_EXTRA 还包含 kerberos,则会启用需要 MIT Kerberos 安装的其他测试。

load_balance

运行测试 src/interfaces/libpq/t/004_load_balance_dns.pl。这需要编辑系统的 hosts 文件并打开 TCP/IP 监听套接字。

oauth

src/test/modules/oauth_validator 下运行测试套件。这会为运行 HTTPS 的测试服务器打开 TCP/IP 监听套接字。

regress_dump_restore

src/bin/pg_upgrade/t/002_pg_upgrade.pl 中运行一个额外的测试套件,该套件通过 pg_dump / pg_restore 循环回归数据库。默认不启用,因为它资源密集。

sepgsql

contrib/sepgsql 下运行测试套件。这需要一种特定方式设置的 SELinux 环境;请参见 第 F.40.3 节

ssl

src/test/ssl 下运行测试套件。这会打开 TCP/IP 监听套接字。

wal_consistency_checking

src/test/recovery 下运行某些测试时使用 wal_consistency_checking=all。默认不启用,因为它资源密集。

xid_wraparound

src/test/modules/xid_wraparound 下运行测试套件。默认不启用,因为它资源密集。

即使在 PG_TEST_EXTRA 中提到了功能,但当前构建配置不支持的功能的测试也不会运行。

此外,src/test/modules 中有一些测试会被 make check-world 运行,但不会被 make installcheck-world 运行。这是因为它们会安装非生产扩展,或者具有其他被认为不适用于生产安装的副作用。如果需要,您可以在其中一个子目录中使用 make installmake installcheck,但不建议在非测试服务器上这样做。

31.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 时才有意义;否则,编码会从区域设置自动选择,并且指定一个与区域设置不匹配的编码将导致错误。

数据库编码可以为针对临时安装或现有安装的测试设置,尽管在后一种情况下,它必须与安装的区域设置兼容。

31.1.5. 自定义服务器设置 #

在运行测试套件时,有几种方法可以使用自定义服务器设置。这对于启用额外的日志记录、调整资源限制或启用额外的运行时检查(如 debug_discard_caches)可能很有用。但请注意,并非所有测试都能在任意设置下顺利通过。

可以使用环境变量 PG_TEST_INITDB_EXTRA_OPTS 将额外的选项传递给在测试设置过程中内部运行的各种 initdb 命令。例如,要使用启用了校验和以及自定义 WAL 段大小和 work_mem 设置来运行测试,请使用:

make check PG_TEST_INITDB_EXTRA_OPTS='-k --wal-segsize=4 -c work_mem=50MB'

对于核心回归测试套件和其他由 pg_regress 驱动的测试,自定义运行时服务器设置也可以在 PGOPTIONS 环境变量中设置 (对于允许的设置),例如:

make check PGOPTIONS="-c debug_parallel_query=regress -c work_mem=50MB"

(这利用了 libpq 提供的功能;有关详细信息,请参见 options。)

在针对临时安装运行时,也可以通过提供一个预先编写的 postgresql.conf 文件来设置自定义设置:

echo 'log_checkpoints = on' > test_postgresql.conf
echo 'work_mem = 50MB' >> test_postgresql.conf
make check EXTRA_REGRESS_OPTS="--temp-config=test_postgresql.conf"

31.1.6. 额外测试 #

核心回归测试套件包含一些默认不运行的测试文件,因为它们可能依赖于平台或运行时间非常长。您可以运行这些或其他额外的测试文件,方法是设置变量 EXTRA_TESTS。例如,要运行 numeric_big 测试:

make check EXTRA_TESTS=numeric_big

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。