Postgresql 中文操作指南

33.1. Running the Tests #

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

33.1.1. Running the Tests Against a Temporary Installation #

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

make check

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

# All 213 tests passed.

或者别的关于哪个测试失败的注释。在假设“失败”表示严重问题之前,请参阅以下 Section 33.2

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

如果您已将 PostgreSQL 配置为安装到已有 PostgreSQL 旧版本安装位置,然后在安装新版本之前执行 make check,您可能会发现由于新程序尝试使用已安装的共享库而导致测试失败。(常见症状是有关未定义符号的抱怨。)如果您想在覆盖旧安装之前运行测试,您需要使用 configure --disable-rpath 进行构建。但是,不建议您在最终安装中使用此选项。

并行回归测试会以您的用户 ID 运行许多进程。目前,最大并行度是 20 个并行测试脚本,这意味着 40 个进程:每个测试脚本有一个服务器进程和一个 psql 进程。因此,如果您的系统针对每个用户强制限制进程数,请确保此限制至少为 50 左右,否则在并行测试中您可能会遇到看似随机的故障。如果您无法提高限制,您可以通过设置 MAX_CONNECTIONS 参数来降低并行度。例如:

make MAX_CONNECTIONS=10 check

运行不超过 10 个并发测试。

33.1.2. Running the Tests Against an Existing Installation #

要在安装后运行测试(请参见 Chapter 17),请初始化数据目录并按照 Chapter 19 中的说明启动服务器,然后输入:

make installcheck

或者对于并行测试:

make installcheck-parallel

除非 PGHOSTPGPORT 环境变量另有指示,否则,测试预计在本地主机和默认端口号上与服务器联系。测试将在名为 regression 的数据库中运行;将删除此名称的任何现有数据库。

测试还将临时创建一些集群范围的对象,如角色、表空间和订阅。这些对象的名称将以 regress_ 开头。当使用 installcheck 模式而安装中有任何这样命名的实际全局对象时,请小心。

33.1.3. Additional Test Suites #

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 假设您已安装相关模块,而不仅安装了核心服务器。

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

在使用 installcheck 模式时,这些测试会创建并销毁名称包含 regression 的测试数据库,例如 pl_regressioncontrib_regression。当使用 installcheck 模式而安装中有任何此类命名的非测试数据库时,请小心。

其中一些辅助测试套件使用 Section 33.4 中说明的 TAP 基础设施。仅当 PostgreSQL 使用 —​enable-tap-tests 选项进行配置时,才运行基于 TAP 的测试。建议进行开发,但如果安装不适合,则可以忽略。

默认情况下并不运行一些测试套件,它们之所以没有默认运行,要么是因为在多用户系统中运行不安全,要么是因为需要特殊软件,要么是因为它们消耗资源。您可以通过将 make 或环境变量 PG_TEST_EXTRA 设置为以空格分隔的列表来决定另外运行哪些测试套件,例如:

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

当前支持以下值:

  • 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 监听套接字。

  • wal_consistency_checking

    • src/test/recovery 下运行特定测试时使用 wal_consistency_checking=all。由于资源密集,因此默认情况下未启用。

不会运行当前构建配置不支持的特性测试,即使它们在 PG_TEST_EXTRA 中被提及。

此外,还有 src/test/modules 中的测试将由 make check-world 运行,但不会由 make installcheck-world 运行。这是因为它们安装非生成扩展或有其他被认为对生成安装不希望的副作用。如果你愿意,你可以在那些子目录中的一个中使用 make installmake installcheck,但建议不要在非测试服务器上这样做。

33.1.4. Locale and Encoding #

默认情况下,使用临时安装的测试使用当前环境中定义的区域设置和由 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 时,通过这种方式设置数据库编码才有意义;否则,将自动从区域设置中选择编码,而指定与区域设置不匹配的编码将导致错误。

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

33.1.5. Custom Server Settings #

在运行回归测试套件时使用的自定义服务器设置可以在 PGOPTIONS 环境变量中设置(对于允许此设置的设置):

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

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

这样做非常有用,可以启用额外的日志记录,调整资源限制,或启用额外的运行时检查,如 debug_discard_caches

33.1.6. Extra Tests #

核心回归测试套件包含一些默认情况下不会运行的测试文件,因为它们可能是平台相关的或运行时间非常长。你可以通过设置变量 EXTRA_TESTS 运行这些或其他额外的测试文件。例如,运行 numeric_big 测试:

make check EXTRA_TESTS=numeric_big