支持的版本: 当前 (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 下启动相当多的进程。目前,最大并发数是 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 基础结构。仅当 PostgreSQL 配置了--enable-tap-tests选项时,才会运行基于 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

提交更正

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