本文主要介紹PostgreSQL回歸測試自定義測試腳本的方法。
文件格式
先介紹需要用到的幾個文件:
調(diào)度文件
· parallel_schedule
· serial_schedule
這兩種文件的格式包括空格行,以“#”開頭的行,以“test:”開頭的行,以“ignore:”開頭的行。其中,以“#”開頭的行一般是注釋;以“test:”開頭的行定義了需要運行的測試用例;以“ignore:”開頭的行,pg_regress仍然會去執(zhí)行這些用例,但是如果有錯誤的話會被忽略。
以“ignore:”開頭的行,一行只能定義一個用例;而已“test:”開頭的行,一行最多定義20個用例,不同用例名之間以空格隔開。如果我們在“test:”行中指定了多個用例,那么這些測試將以并行模式(parallel_schedule)運行,如果只有一個用例,那么它將以串行模式(serial_schedule)運行。當(dāng)我們用“make check”命令的時候,調(diào)度的是parallel_schedule文件,而“make installcheck”調(diào)度的是serial_schedule文件。
新增一個回歸測試的時候,需要分別在parallel_schedule和serial_schedule中都加上該測試的名字。
回歸測試的SQL代碼和預(yù)期輸出
· sql/
該目錄中包含了回歸測試要運行的一些sql腳本,回歸測試把每一個文件都當(dāng)做一個獨立的測試項,所以通常我們一個sql文件只測試一種特性。
· excepted/
該目錄包含了所有回歸測試的期望輸出文件*.out,這些文件不僅包含了查詢語句的輸出結(jié)果,還包含了上述提到的sql文件的所有內(nèi)容(包括注釋)。
· results/
該目錄中起初是沒有任何文件的,當(dāng)我們運行完回歸測試之后,才會生成一批*.out文件。
Tips:當(dāng)添加新的測試用例時,也可以copy這里的文件放到excepted/目錄下。
樣例
下面是自定義一個回歸測試的具體例子。
· sql/simple.sql
下面這個腳本是將要被運行的回歸測試。
--
-- A simple brain-dead test to show how one is written
--
-- Create a table
CREATE TABLE simple_test (a integer, b text);
-- Add a couple of rows
COPY simple_test FROM stdin;
1 foo
2 bar
3 baz
4 floob
\.
-- Select it back out in reverse order
SELECT * FROM simple_test ORDER BY a DESC;
-- remove a row
DELETE FROM simple_test WHERE length(b) > 3;
-- Select again
SELECT * FROM simple_test ORDER BY a DESC;
-- Clean up
DROP TABLE simple_test;
· expected/simple.out
該文件是上面回歸測試腳本的期望輸出。
--
-- A simple brain-dead test to show how one is written
--
-- Create a table
CREATE TABLE simple_test (a integer, b text);
-- Add a couple of rows
COPY simple_test FROM stdin;
-- Select it back out in reverse order
SELECT * FROM simple_test ORDER BY a DESC;
a |? b?
---+-------
4 | floob
3 | baz
2 | bar
1 | foo
(4 rows)
-- remove a row
DELETE FROM simple_test WHERE length(b) > 3;
-- Select again
SELECT * FROM simple_test ORDER BY a DESC;
a |? b?
---+-----
3 | baz
2 | bar
1 | foo
(3 rows)
-- Clean up
DROP TABLE simple_test;
· parallel_schedule
這個命名為“simple”的測試需要加到調(diào)度里面才能真的被運行。理論上來說,加在任何地方都是可以的,我們可以找到跟該測試同類型的地方,或者開頭字母一樣的地方,然后把這個新增的測試名字加進去。
# ----------
# Another group of parallel tests
# ----------
#test: union case join random delete?namespace?privileges
test: union case join random delete simple?namespace?privileges
# ----------
# Another group of parallel tests
serial_schedule
make installcheck將會用到該調(diào)度。一般來說,為了方便維護,最好跟parallel_schedule的存放順序一致,如下:
# src/test/regress/serial_schedule
# This should probably be in an order similar to parallel_schedule.
test: union
test: case
test: join
test: random
test: delete?
test: simple?
test: namespace?
test: privileges