我正在编写一个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
测试失败。
有什么方法吗?
答案 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;
$$