支援的版本:目前 (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 需要更多的時間和磁碟空間。

在具有多個 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 基礎架構。僅當使用 --enable-tap-tests 選項設定 PostgreSQL 時,才會執行基於 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 提供的功能;有關詳細資訊,請參閱 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

提交更正

如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。