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

标签 postgresql unit-testing pgtap

我用 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

我可能真的 sleep 不足,但我想要和我看起来很相似。

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


更新有关细节:这就是我定义相关存储过程的方式:

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 语法,我也几乎是在黑暗中摸索——在搜索 :: 时,google 和 postgresql.org 上的搜索都没有返回任何有用的信息。我最终幸运地猜测这可能是一个运算符,并发现 :: 是一个 type cast . CREATE FUNCTIONcolumn_name 参数文档说 'RETURNS TABLE 也暗示了 RETURNS SETOF' 这让我明白了,例如here也许herehere .新的尝试:

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",100.0)');

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

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


更新 2:postgresql IRC channel (irc://irc.freenode.net/#postgresql) 上的 RhodiumToad 帮助我找到了正确的语法。如果我对 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');

现在将 have 和 want 结果比较为相等,测试通过。运行测试时的日志输出:

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

哇哦!! :-)

最佳答案

您没有提供所有详细信息,但我怀疑这是数据类型不匹配。 pgTAP 往往需要精确匹配。试试这个:

PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::foo);

其中 foo 是函数 select_some_data 的返回类型。

关于postgresql - pgtap:预期和获得的结果相等,但测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7323844/

相关文章:

sql - PostgreSQL 基于范围的连接工作太慢

postgresql - 使用具有相同主键的第三个表连接具有公共(public)字段的两个表

postgresql - 已安装 PostGIS,但无法选择版本或添加地理列

node.js - 如何修复多行 node-postgres 插入 - 语法错误等于或接近 $4

c# - 如何配置 TeamCity 以同时运行测试而不是一个接一个地运行?

Android 单元测试只有放在 androidTest 文件夹中才能编译

javascript - 如何在单元测试期间禁用 Morgan(请求记录器)?

unit-testing - 如何在 Windows 上安装 pgTAP?