33.1. 运行测试

可以针对已经安装并正在运行的服务器运行回归测试,也可以在构建树中使用临时安装来运行回归测试。此外,存在用于运行测试的“并行”和“Sequences”模式。Sequences 方法单独运行每个测试脚本,而并行方法则启动多个服务器进程以并行运行测试组。并行测试可增强对进程间通信和锁定正常工作的信心。

33 .1.1. 针对临时安装运行测试

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

make check

在顶级目录中。 (或者,您可以更改为src/test/regress并在那里运行命令.)最后,您应该看到类似以下内容:

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

否则,说明哪些测试失败。在假定“故障”代表严重问题之前,请参阅下面的Section 33.2

因为此测试方法运行临时服务器,所以如果您以 root 用户身份进行构建,则该方法将不起作用,因为该服务器不会以 root 用户身份启动。建议的步骤是不要以超级用户身份进行构建,或者在完成安装后执行测试。

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

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

make MAX_CONNECTIONS=10 check

同时运行不超过十个测试。

33 .1.2. 针对现有安装运行测试

要在安装后运行测试(请参阅Chapter 16),请初始化数据区域并按照Chapter 18中的说明启动服务器,然后键入:

make installcheck

或进行并行测试:

make installcheck-parallel

测试将期望与 localhost 上的服务器和默认端口号联系,除非PGHOSTPGPORT环境变量另有指示。测试将在名为regression的数据库中运行;使用该名称的任何现有数据库将被删除。

测试还将临时创建一些群集范围内的对象,例如角色和表空间。这些对象的名称以regress_开头。注意在以这种方式命名的任何实际用户或表空间的安装中使用installcheck模式。

33 .1.3. 其他测试套件

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

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

make check-world
make installcheck-world

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

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

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

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

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

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

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

  • src/bin下的 Client 端程序测试。另请参见Section 33.4

使用installcheck模式时,这些测试将销毁名为pl_regressioncontrib_regressionisolation_regressionecpg1_regressionecpg2_regression以及regression的任何现有数据库。

仅当使用选项--enable-tap-tests配置 PostgreSQL 时,才运行基于 TAP 的测试。建议将其用于开发,但是如果没有合适的 Perl 安装,可以将其省略。

某些测试套件默认情况下不运行,原因是它们在多用户系统上运行不安全,或者因为它们需要特殊的软件。您可以通过将make或环境变量PG_TEST_EXTRA设置为以空格分隔的列表来决定要额外运行的测试套件,例如:

make check-world PG_TEST_EXTRA='kerberos ldap ssl'

当前支持以下值:

  • kerberos

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

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

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

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

33 .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 时才有意义。否则,将自动从语言环境中选择编码,并且指定与语言环境不匹配的编码将导致错误。

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

33 .1.5. 额外测试

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

make check EXTRA_TESTS=numeric_big

要运行归类测试:

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

collate.linux.utf8测试仅在 Linux/glibc 平台上有效。 collate.icu.utf8测试仅在构建了对 ICU 的支持时有效。只有在使用 UTF-8 编码的数据库中运行时,两个测试才会成功。

33 .1.6. 测试热备用

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

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

psql -h primary -c "CREATE DATABASE regression"

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

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

允许这些更改传播到备用数据库。

现在,将默认的数据库连接安排为与被测试的备用服务器构建连接(例如,通过设置PGHOSTPGPORT环境变量)。最后,在回归目录中运行make standbycheck

cd src/test/regress
make standbycheck

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