2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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 下啟動大量程序。目前,最大併發度是二十個並行測試指令碼,這意味著四十個程序:每個測試指令碼都有一個伺服器程序和一個 psql 程序。因此,如果您的系統對每個使用者的程序數量有限制,請確保此限制至少為五十個左右,否則您可能會在並行測試中遇到隨機的失敗。如果您無法提高此限制,可以透過設定 MAX_CONNECTIONS 引數來降低並行度。例如:

make MAX_CONNECTIONS=10 check

最多同時執行十個測試。

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 需要更多的時間和磁碟空間。

在一臺現代的多核機器上,如果沒有嚴格的作業系統限制,您可以透過並行化大大加快速度。大多數 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 基礎設施。基於 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 環境;請參見 第 F.40.3 節

ssl

src/test/ssl 下執行測試套件。這會開啟 TCP/IP 監聽套接字。

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 提供的功能;有關詳細資訊,請參見 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

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。