受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

Chapter 31. 回归测试

回归测试是针对PostgreSQL中 SQL 实现的一套全面测试。它们既测试标准 SQL 操作,也测试 PostgreSQL的扩展能力。

31.1. 运行测试 #

回归测试既可以针对已经安装并正在运行的服务器执行,也可以在构建树中 使用临时安装来执行。此外,运行测试时还有并行顺序两种模式。顺序方式一次只运行一个测试脚本, 而并行方式会启动多个服务器进程,以并行方式运行一组测试。并行测试能 进一步确认进程间通信和锁定机制是否正常工作。在某些测试有此需要时, 即使在并行模式下,它们也可能按顺序运行。

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

要在构建完成但尚未安装时运行并行回归测试,请在顶层目录中输入:

make check

(或者也可以切换到src/test/regress并在那里运行该命令。) 并行运行的测试以前缀+标记,顺序运行的测试以前缀 -标记。最后你应该会看到类似下面的内容:


# All 213 tests passed.

否则会看到哪些测试失败的提示。在认定Section 31.2下文所述的失败表示严重问题 之前,请先阅读该节。

由于这种测试方法会运行一个临时服务器,如果你以 root 用户身份进行构建, 它将无法工作,因为服务器不会以 root 身份启动。推荐做法是不要以 root 身份构建;否则应在安装完成后再执行测试。

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

并行回归测试会在你的用户 ID 下启动相当多的进程。目前最大并发度为二十个 并行测试脚本,也就是四十个进程:每个测试脚本都有一个服务器进程和一个 psql进程。因此,如果你的系统对每个用户可创建的 进程数施加限制,请确保该限制至少有五十个左右,否则并行测试中可能会出现 看似随机的失败。如果无法提高该限制,可以通过设置MAX_CONNECTIONS 参数来降低并行度。例如:

make MAX_CONNECTIONS=10 check

这样一次最多只会并发运行十个测试。

31.1.2. 针对现有安装运行测试 #

要在安装后运行测试(见Chapter 17),请初始化一个数据目录, 并按Chapter 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模式。

其中一些辅助测试套件会使用Section 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 环境;参见Section F.38.3

ssl

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

wal_consistency_checking

使用wal_consistency_checking=all运行 src/test/recovery下的某些测试。由于资源开销大, 默认不启用。

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)可能很有用。但请注意, 并非所有测试都能在任意设置下都顺利通过。

在测试准备过程中,内部运行的各个initdb命令可以通过 环境变量PG_TEST_INITDB_EXTRA_OPTS传入附加选项。例如, 要在启用校验和并使用自定义 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

提交更正

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