Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

31.1. 运行测试 #

31.1.1. 对临时安装运行测试
31.1.2. 对现有安装运行测试
31.1.3. 其他测试套件
31.1.4. 语言环境和编码
31.1.5. 自定义服务器设置
31.1.6. 其他测试

可以针对已经安装并运行的服务器或使用构建树中的临时安装来运行回归测试。此外,还有 并行顺序 模式用于运行测试。顺序方法单独运行每个测试脚本,而并行方法启动多个服务器进程以并行运行组测试。并行测试提高了进程间通信和锁定工作的正确性的可信度。某些测试甚至在 并行 模式中也会顺序运行,如果测试需要这样做的话。

31.1.1. 针对临时安装运行测试 #

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

make check

在顶级目录中。(或者,可以更改为 src/test/regress 并在其中运行命令。)并行运行的测试带有 + 前缀,顺序运行的测试带有 - 前缀。最后应该会看到类似


# All 213 tests passed.

的内容,或有关哪些测试失败的说明。请参阅下面的 第 31.2 节,然后再假设 failure 代表严重问题。

由于此测试方法运行临时服务器,因此如果您以 root 用户身份构建,它将无法工作,因为服务器不会以 root 身份启动。建议的做法不是以 root 身份构建,否则在完成安装后进行测试。

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

并行回归测试在您的用户 ID 下开启了一些进程。目前,最大并发是 20 个并行测试脚本,相当于 40 个进程:每个测试脚本有一个服务器进程和一个 psql 进程。因此,如果您的系统对每个用户强制执行进程数量限制,请确保此限制至少为 50 左右,否则并行测试中可能会出现看似随机的故障。如果您无法提高限制,可以通过设置 MAX_CONNECTIONS 参数来降低并行程度。例如

make MAX_CONNECTIONS=10 check

一次最多运行 10 个测试。

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 更长的时间和更多的磁盘空间。

在具有多个 CPU 核且没有严格操作系统限制的现代计算机上,您可以通过并行操作让事情变得明显更快。大多数 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 基础结构。仅在使用--enable-tap-tests选项配置 PostgreSQL 时才运行基于 TAP 的测试。虽然建议在开发中使用此功能,但如果没有合适的 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 监听套接字。

ssl

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

load_balance

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

libpq_encryption

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

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 提供的功能;有关详细信息,请参见 选项。)

在与临时安装运行时,还可以通过提供预先编写的 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