迴歸測試可以在已安裝並正在執行的伺服器上執行,也可以在構建樹中的臨時安裝上執行。此外,還有用於執行測試的“並行”和“順序”模式。順序方法單獨執行每個測試指令碼,而並行方法啟動多個伺服器程序以並行執行測試組。並行測試增加了對程序間通訊和鎖是否正常工作的信心。在“並行”模式下,一些測試也可能按順序執行,以防測試需要如此。
在構建但未安裝後,要執行並行迴歸測試,請鍵入
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
最多同時執行十個測試。
安裝後執行測試(參見 第 17 章),請按照 第 18 章 中的說明初始化一個數據目錄並啟動伺服器,然後鍵入
make installcheck
或者對於並行測試
make installcheck-parallel
除非由 PGHOST
和 PGPORT
環境變數另行指示,否則測試將期望在本地主機和預設埠號上連線到伺服器。測試將在名為 regression
的資料庫中執行;任何同名的現有資料庫都將被刪除。
測試還將暫時建立一些叢集範圍的物件,例如角色、表空間和訂閱。這些物件的名稱將以 regress_
開頭。在使用 installcheck
模式時,請注意避免使用任何名稱以此開頭的實際全域性物件的安裝。
make check
和 make installcheck
命令僅執行“核心”迴歸測試,這些測試用於測試 PostgreSQL 伺服器的內建功能。原始碼分發版包含許多其他測試套件,其中大部分與附加功能有關,例如可選的過程語言。
要執行適用於已選擇構建的模組的所有測試套件,包括核心測試,請在構建樹的頂部鍵入以下命令之一:
make check-world make installcheck-world
這些命令分別使用臨時伺服器或已安裝的伺服器執行測試,正如前面為 make check
和 make installcheck
所解釋的。其他注意事項與前面為每種方法解釋的相同。請注意,make check-world
為每個被測試的模組構建一個單獨的例項(臨時資料目錄),因此它比 make installcheck-world
需要更多的時間和磁碟空間。
在一臺現代的多核機器上,如果沒有嚴格的作業系統限制,您可以透過並行化大大加快速度。大多數 PostgreSQL 開發者實際使用的執行所有測試的配方是這樣的:
make check-world -j8 >/dev/null
其中 -j
限制接近或略多於可用核心數。丟棄 stdout 消除了當您只想驗證成功時無關緊要的噪音。(如果失敗,stderr 訊息通常足以確定在哪裡進一步檢視)。
或者,您可以透過在構建樹的相應子目錄中鍵入 make check
或 make installcheck
來執行單個測試套件。請記住,make installcheck
假定您已安裝了相關的模組,而不僅僅是核心伺服器。
可以透過這種方式呼叫的其他測試包括:
可選過程語言的迴歸測試。這些位於 src/pl
下。
contrib
模組的迴歸測試,位於 contrib
下。並非所有 contrib
模組都有測試。
介面庫的迴歸測試,位於 src/interfaces/libpq/test
和 src/interfaces/ecpg/test
。
核心支援的認證方法的測試,位於 src/test/authentication
。(有關其他與認證相關的測試,請參見下文)。
測試併發會話行為的測試,位於 src/test/isolation
。
崩潰恢復和物理複製的測試,位於 src/test/recovery
。
邏輯複製的測試,位於 src/test/subscription
。
客戶端程式的測試,位於 src/bin
下。
在使用 installcheck
模式時,這些測試將建立和銷燬包含 regression
的測試資料庫名稱,例如 pl_regression
或 contrib_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 install
和 make installcheck
,但不建議在非測試伺服器上這樣做。
預設情況下,使用臨時安裝的測試會使用當前環境中定義的區域設定,以及 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 時才有意義;否則,編碼會從區域設定自動選擇,並且指定一個與區域設定不匹配的編碼將導致錯誤。
資料庫編碼可以為針對臨時安裝或現有安裝的測試設定,儘管在後一種情況下,它必須與安裝的區域設定相容。
在執行測試套件時,有幾種方法可以使用自定義伺服器設定。這對於啟用額外的日誌記錄、調整資源限制或啟用額外的執行時檢查(如 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"
核心迴歸測試套件包含一些預設不執行的測試檔案,因為它們可能依賴於平臺或執行時間非常長。您可以執行這些或其他額外的測試檔案,方法是設定變數 EXTRA_TESTS
。例如,要執行 numeric_big
測試:
make check EXTRA_TESTS=numeric_big
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。