加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – pgtap:预期和获得的结果相等,但测试失败

发布时间:2020-12-13 18:06:10 所属栏目:百科 来源:网络整理
导读:我使用 pgtap来测试postgresql存储过程.其 results_eq函数获取存储过程的结果,将其与预期结果进行比较,如果两者不相等则报告失败. 这是我正在运行的代码: PREPARE result_have AS SELECT select_some_data(12345,'test_string');PREPARE result_want AS VAL
我使用 pgtap来测试postgresql存储过程.其 results_eq函数获取存储过程的结果,将其与预期结果进行比较,如果两者不相等则报告失败.

这是我正在运行的代码:

PREPARE result_have AS SELECT select_some_data(12345,'test_string');
PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)');
SELECT results_eq('result_have','result_want');

这是失败输出:

not ok 21
# Failed test 21: "this should return a result"
#     Columns differ between queries:
#         have: ("(""2010-09-07 06:05:00+00"",100.0)")
#         want: ("(""2010-09-07 06:05:00+00"",100.0)")
# Looks like you failed 1 test of 21

我可能真的睡不着觉,但想要和我看起来很相似.

有谁知道为什么这被报告为失败?

有关详细信息的更新:这是我如何定义有问题的存储过程:

CREATE OR REPLACE FUNCTION select_some_data
(
    IN p_some_pkey integer,IN p_some_code varchar(16)
)
RETURNS TABLE(timestamp_utc timestamp with time zone,value varchar)
  ...

所以要遵循peters advice,我尝试更改我的代码,但没有成功:

PREPARE result_have AS SELECT select_some_data(12345,'test_string');
-- TODO: none of these work,syntax error at or near "TABLE"
-- PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::TABLE(timestamp with time zone,varchar));
-- PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::'TABLE(timestamp with time zone,varchar)');
-- this is the old code...
PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)');

SELECT results_eq('result_have','result_want');

正如你可能会说的那样,即使是基本的postgresql语法,我也很难在黑暗中刺伤 – 谷歌和postgresql.org上的搜索都没有在搜索::时返回任何有用的内容.我最终冒了一个幸运的猜测,这可能是一个运算符,并发现::是type cast. CREATE FUNCTION的column_name参数文档说’RETURNS TABLE也暗示RETURNS SETOF’让我得到例如新的尝试:here,也许是here和here.

PREPARE result_have AS SELECT select_some_data(12345,'test_string');
-- TODO: doesn't work,syntax error at or near "("
-- PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::SETOF(timestamp with time zone,varchar));
-- TODO: doesn't work,syntax error at or near ","
-- PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::SETOF RECORD(timestamp with time zone,varchar));
-- this is the old code...
PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",'result_want');

这是毫无意义的,我只是在做猜测.任何人都可以用正确的语法帮助我吗?请注意,该函数只是RETURNS TABLE,因为这是我能够开始工作的第一件事,所以如果有一个解决方案需要改变它,我很乐意改变它.

更新2:postgresql IRC频道上的RhodiumToad(irc://irc.freenode.net/#postgresql)帮助我使用了正确的语法.如果我对postgresql了解得多一些,我可以认为这只是有意义的:两种数据类型,两个演员阵容(DOH!):o).

此时,测试数据库中只有一个数据集,因此上面使用的语法可能仍然有效.据我所知,一旦返回多个数据集,它可能会失败,因此它应该是SELECT * FROM,而不仅仅是SELECT:

PREPARE result_have AS SELECT * FROM select_some_data(12345,'test_param_code');
PREPARE result_want AS VALUES ('2010-09-07 06:05:00+00'::timestamp with time zone,'100.0'::varchar);

SELECT results_eq('result_have','result_want','have and want should be equal');

现在已经和希望结果相等,测试通过.运行测试时的日志输出:

ok 21 - have and want should be equal
ok
All tests successful.
Files=1,Tests=21,1 wallclock secs ( 0.02 usr  0.00 sys +  0.05 cusr  0.03 csys =  0.10 CPU)
Result: PASS

WOOT!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读