如何通过PgTAP使用测试模式?

时间:2018-07-18 16:52:56

标签: postgresql unit-testing pgtap

我正在将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时在执行脚本之前执行创建脚本?还是我误解了这些动作之间的关系?谢谢!

0 个答案:

没有答案