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

java – H2 postgresql模式似乎不适合我

发布时间:2020-12-14 17:43:51 所属栏目:Java 来源:网络整理
导读:嗨,我的应用程序访问Postgres数据库,我有很多预定义的查询(排名,分区,复杂的连接等)我对Postgres.现在我想用小的测试数据去单元测试这些查询行为.所以我从H2 / Junit开始.我发现大多数Postgres的查询如Rank,Partition,Complex等更新等等.所以我想到使用H2 Po
嗨,我的应用程序访问Postgres数据库,我有很多预定义的查询(排名,分区,复杂的连接等)我对Postgres.现在我想用小的测试数据去单元测试这些查询行为.所以我从H2 / Junit开始.我发现大多数Postgres的查询如Rank,Partition,Complex等更新等等.所以我想到使用H2 PosgreSQL兼容模式,认为所有的postgres查询都可以在H2上工作,如果我错了,请纠正我.

我遵循H2文档说要使用PostgreSQL模式,使用数据库URL jdbc:h2:?/ test; MODE = PostgreSQL或SQL语句SET MODE PostgreSQL.

我使用SET MODE PostgreSQL启用模式,我试图点燃一个涉及rank()的查询,并在postgres中工作,但它没有工作H2.它给我以下例外

Function "RANK' not found; in SQL statement

请指导我是新的H2和数据库测试.提前致谢.我使用H2 jdbc驱动程序通过思考H2 Posgress兼容性模式来触发后台查询,以允许我触发后台查询.

解决方法

So I thought of using H2 PosgreSQL compatibility mode by thinking all postgres queries will work on H2 please correct me if I am wrong

恐怕不是这样.

H2尝试模拟PostgreSQL语法并支持一些功能和扩展.它不会完全匹配PostgreSQL的行为,并且不支持所有功能.

你唯一的选择是:

>在测试中使用PostgreSQL要么
>停止使用H2不支持的功能

我建议使用Pg进行测试.编写initdb的postgres实例的测试工具相对来说比较简单,然后启动测试工具进行测试,然后将其撕下来.

更新基于评论:

“单位”和“整合”测试之间没有硬线.在这种情况下,H2也是外部组件.纯粹的单元测试将有一个虚拟的响应者查询作为测试工具的一部分.对H2的测试与对PostgreSQL的测试一样是一个“集成”测试.它在进程和内存中的事实是一个方便,但不是功能上的重要.

如果要进行单元测试,应该为应用程序编写另一个数据库目标,以便与“PostgreSQL”,“SybaseIQ”等目标一起使用.称之为“MockDatabase”.这应该只是从查询返回预期的结果.它没有真正运行查询,它只存在来测试其余代码的行为.

就个人而言,我认为这是一个巨大的时间浪费,但是这是纯粹主义者的一个单位测试,以避免将外部依赖性引入到测试工具中.

如果您坚持使用单元(而不是集成)对您的DB组件进行测试,但是不能/不会写入模拟界面,则必须找到一种使用现有模块的方法. H2将是合理的候选对象 – 但是您必须使用新的可用于H2的查询集编写新的后端,不能仅仅重新使用PostgreSQL后端.正如我们已经建立的,H2不支持您需要使用PostgreSQL的所有功能,因此您必须找到与H2完全相同的方法.一个选择是使用“预期”结果创建一个简单的H2数据库,并返回这些结果的简单查询,完全忽略实际应用程序的架构.这里唯一真正的缺点是,维护可能是一个重大的痛苦…但这是单元测试.

就我个人而言,我只是用PostgreSQL测试.除非我正在测试独立的单独的课程或模块,这些单独的单元是狭窄接口的定义良好的单元,我不在乎是否有人称之为“单元”或“集成”测试.我会单元测试,比如数据验证类.对于数据库接口代码,纯粹的单元测试没有什么意义,我只需要进行集成测试.

虽然具有进程内存数据库方便,但不是必需的.您可以编写测试工具,以便设置代码initdbs一个新的PostgreSQL并启动它;那么拆卸代码会杀死postmaster并删除datadir.我在this answer写了更多关于这个.

也可以看看:

> Running PostgreSQL in memory only

至于:

If all queries with expected end datasets works fine in Postgress I can assume it will work fine in all other dbs

如果我明白你正在说的正确,那么是的,那就是这种情况 – 如果你的代码的其余部分与PostgreSQL中的数据集一起工作,它通常与包含来自另一个数据库的相同数据的数据集相同.只要它使用简单的数据类型,不是数据库特定的功能,当然.

(编辑:李大同)

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

    推荐文章
      热点阅读