我正在将PgTAP用于我们的PostgreSQL单元测试框架。我了解其操作的基础知识,并成功编写了一些测试。
但是,我想利用创建正式测试“方案”的能力,如this blog中的示例所述:
我们创建架构:
CREATE SCHEMA unit_testing;
TEST=# CREATE OR REPLACE FUNCTION unit_testing.setup_tap_test_example()
RETURNS SETOF TEXT AS $$
BEGIN
INSERT INTO public.table1 VALUES ('test',1);
RETURN NEXT is(a, 'TEST', 'Should have initial row in table1') FROM public.table1 WHERE b = 1;
END;
$$ LANGUAGE plpgsql;
TEST=# CREATE OR REPLACE FUNCTION unit_testing.tap_test_example()
RETURNS SETOF TEXT AS $$
BEGIN
RETURN NEXT has_table('public', 'table1', 'table public.table1 exists' );
RETURN NEXT has_column('public', 'table1', 'a', 'column public.table1.a exists');
RETURN NEXT col_type_is('public', 'table1', 'a', 'text', 'Type of column public.table1.a is text');
RETURN NEXT has_column('public', 'table1', 'b', 'column public.table1.b exists');
RETURN NEXT col_type_is('public', 'table1', 'b', 'integer', 'Type of column public.table1.b is integer');
RETURN NEXT has_index('public', 'table1','table1_b_idx', 'Table public.table1 has an index table1_b_idx');
END;
$$ LANGUAGE plpgsql;
TEST=# CREATE OR REPLACE FUNCTION unit_testing.teardown_tap_test_example()
RETURNS SETOF TEXT AS $$
BEGIN
RETURN NEXT lives_ok('DELETE FROM public.table1 WHERE b = 1');
END;
$$ LANGUAGE plpgsql;
然后运行它:
TEST=# BEGIN;
TEST=# SELECT * FROM runtests('unit_testing','^tap_test_example');
ok 1 - Should have initial row in table1
# unit_testing.tap_test_example()
ok 2 - table public.table1 exists
ok 3 - column public.table1.a exists
ok 4 - Type of column public.table1.a is text
ok 5 - column public.table1.b exists
ok 6 - Type of column public.table1.b is integer
ok 7 - Table public.table1 has an index table1_b_idx
ok 8
1..8
TEST=# ROLLBACK;
我的问题是:我们是否在与第二个脚本相同的脚本中运行第一个脚本块?这是有道理的,因为我们必须在调用模式/功能之前确保它们存在。我们是否还可以将“模式/功能创建”脚本和“测试执行脚本”分成多个文件以实现模块化?如果是这样,我们如何确保在调用pg_prove
时在执行脚本之前执行创建脚本?还是我误解了这些动作之间的关系?谢谢!