Postgresql扩展pg_regress跨PG版测试

时间:2017-09-28 07:58:53

标签: postgresql

我正在编写一个PostgreSQL扩展,需要在PostgreSQL 9.4,9.5,9.6和10上工作。我正在使用标准的pg_regress回归测试和make installcheck进行测试。我正在尝试使用Travis-CI在各版本之间设置测试。

因为这是一个安全关键的扩展,我的测试用例中有很多声明会抛出错误,例如检查列入白名单的关键字。

pg_regress通过将测试脚本的输出与预期输出进行比较来工作。对于普通的,成功的查询,这很好,但是对于错误我有问题。

对于9.6,错误的输出似乎始终具有CONTEXT行,而对于9.4,它永远不会。换句话说,9.6正在发送9.4中缺少的故障排除信息,这导致测试在不同版本之间不兼容。

我的测试脚本的相关部分是:

set client_min_messages to warning;
set log_error_verbosity to terse;
create extension roleman;

-- whitelist errors

-- no tables so pick a random number and cast to oid
select roleman.grant_table('postgres', 1::oid, array['execute', 'drop']);
select roleman.grant_schema('postgres', 'foo', array['execute']);
select roleman.grant_schema_all('postgres', 'foo', 'tables', array['execute', 'drop everything']);
select roleman.grant_database('postgres', 'foo', array['execute']);
select roleman.grant_function('postgres', 1::OID, array['wheeee']);
select roleman.grant_seq('postgres', 1::oid, array['execute']);

9.6的输出是:

set client_min_messages to warning;
set log_error_verbosity to terse;
create extension roleman;
-- whitelist errors
-- no tables so pick a random number and cast to oid
select roleman.grant_table('postgres', 1::oid, array['execute', 'drop']);
ERROR:  bad database permissions for postgres,  table 1, perms execute, drop
CONTEXT:  PL/pgSQL function grant_table(text,regclass,text[]) line 4 at RAISE
select roleman.grant_schema('postgres', 'foo', array['execute']);
ERROR:  bad permissions for postgres,  schema foo, perms execute
CONTEXT:  PL/pgSQL function grant_schema(text,text,text[]) line 4 at RAISE
select roleman.grant_schema_all('postgres', 'foo', 'tables', array['execute', 'drop everything']);
ERROR:  bad database permissions for postgres,  schema foo, type tables, perms execute, drop everything
CONTEXT:  PL/pgSQL function grant_schema_all(text,text,text,text[]) line 5 at RAISE
select roleman.grant_database('postgres', 'foo', array['execute']);
ERROR:  bad database permissions for postgres, dbname foo, perms execute
CONTEXT:  PL/pgSQL function grant_database(text,text,text[]) line 4 at RAISE
select roleman.grant_function('postgres', 1::OID, array['wheeee']);
ERROR:  bad database permissions for postgres,  function 1, perms wheeee
CONTEXT:  PL/pgSQL function grant_function(text,regprocedure,text[]) line 4 at RAISE
select roleman.grant_seq('postgres', 1::oid, array['execute']);
ERROR:  bad database permissions for postgres,  sequence 1, perms execute
CONTEXT:  PL/pgSQL function grant_seq(text,regclass,text[]) line 4 at RAISE

在9.4上输出相同,只是缺少CONTEXT行。我尝试通过在脚本开头设置错误详细程度来禁用这些行,但这没有任何效果。缺少CONTEXT行由pg_regress测试失败。

有什么方法吗?

1 个答案:

答案 0 :(得分:2)

这种事情是正确的痛苦。 pg_regress支持备用输出文件,但它们使用和维护起来很笨拙。

BDR和pglogical的作用是\set VERBOSITY terse,这有助于解决一些此类问题。

在更复杂的情况下,有时您可以使用DO块。像

这样的东西
DO LANGUAGE plpgsql $$
BEGIN
    BEGIN
        PERFORM the_statement;
    EXCEPTION WHEN ... THEN ...
        ... check exception matches expected here ...
    END;
END;
$$