当前位置: 首页 > 面试题库 >

H2 postgresql模式似乎不适合我

微生阳平
2023-03-14
问题内容

嗨,我的应用程序访问Postgres数据库,并且我有很多预定义的查询(Rank,Parition,complex
join等)对Postgres触发。现在,我要使用小的测试数据对这些查询行为进行单元测试。所以我从H2 /
Junit开始。我发现大多数Postgres查询,例如Rank,Partition,更新时的复杂情况等。因此,我想到使用所有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 Posgress兼容模式将允许我触发postgres查询,因此我正在使用H2
jdbc驱动程序来触发postgres查询。


问题答案:

所以我想通过考虑所有postgres查询都可以在H2上使用H2 PosgreSQL兼容模式,如果我错了请指正我

恐怕那不是真的。

H2尝试模仿PostgreSQL语法并支持一些功能和扩展。它永远不会完全适合PostgreSQL的行为,并且不支持所有功能。

您唯一的选择是:

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

我建议使用Pg进行测试。编写一个测试工具,它是initdb的一个postgres实例,并启动它进行测试,然后将其拆解,这相对简单。

根据评论更新:

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

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

就个人而言,我认为这是浪费时间,但这是单元测试纯粹主义者将要做的,以避免将外部依赖项引入测试工具。

如果您坚持要对DB组件进行单元(而不是集成)测试,但不能/不会编写模拟接口,则必须找到一种使用现有接口的方法。H2将是一个合理的选择-但是您必须编写一个新的后端,并使用一组适用于H2的新查询,您不能仅仅重复使用PostgreSQL后端。正如我们已经建立的那样,H2不支持您需要与PostgreSQL一起使用的所有功能,因此您将不得不找到不同的方法来对H2进行相同的操作。一种选择是创建一个具有“预期”结果和返回这些结果的简单查询的简单H2数据库,而完全忽略实际应用程序的架构。唯一真正的缺点是维护可能会非常麻烦……但这就是单元测试。

就个人而言,我只需要使用PostgreSQL进行测试。除非我要测试单独的类或模块,这些类或模块单独作为狭窄接口的定义明确的单元进行测试,否则我不在乎有人将其称为“单元”测试还是“集成”测试。我将对数据验证类进行单元测试。对于数据库接口代码,纯粹的单元测试意义不大,我将进行集成测试。

尽管拥有一个进程内内存数据库很方便,但这不是必需的。您可以编写测试工具,使安装代码成为initdb新的PostgreSQL并启动它。然后拆卸代码将杀死邮局主管并删除datadir。我在此答案中写了更多有关此的内容。

至于:

如果所有具有预期最终数据集的查询在Postgress中都可以正常工作,我可以假定它在所有其他数据库中都可以正常工作

如果我理解正确的话,那就是-如果 _其余代码_可用于PostgreSQL的数据集,则通常应与包含来自另一个数据库的相同数据的数据集相同。当然,只要使用简单的数据类型,而不使用数据库特定的功能。



 类似资料:
  • 我实际上试图解决一个问题,Maven抱怨文件中缺少参数的vaule。因此,我决定通过将选项放在Jenkins中来调试Maven。但它抱怨我输入了一个不正确的Java参数: Jenkins认为我支持Java。后来我发现Jenkins生成的命令是这样的: /usr/java/jdk1.7.0_17/bin/java-x-cp/var/lib/jenkins/plugins/maven-plugin/w

  • 我尝试使用加密与Openenssl,但似乎我的输出不是我所期望的。我使用的密钥和测试向量取自http://www.inconteam.com/software-development/41-encryption/55-aes-test-vectors#aes-ecb-256 我的意见如下: 例如,我使用作为测试向量。 我出局了。bin为: 而不是: 我的问题是我是否用错了Openssl,或者是什么

  • 问题内容: 我需要在我的老师不让我们使用IDE的前提下对此进行开头。我们使用TextPad。我要单击此标签,然后将其从“ H”更改为“ T”。目前,当我单击标签时,没有执行任何操作。我忘记了什么? 问题答案: 您的工具,但您还需要告知将事件发送给自己。在构造函数的最后,您需要说 如果您还记得可以将 任何 类放入,并且必须将您的侦听器连接到,则这更有意义。本身是侦听器这一事实并不能免除您的这种责任。

  • 我一直在使用URLConnection。guessContentTypeFromName(String fname)来检测我需要在标头中使用什么mime类型来返回不同的文档。 在我用测试程序测试之前,它工作得很好 。我可以通过测试使它工作。jpg或测试。pdf,但不带测试。csv。 我没有问题获得pdf和jpg扩展的良好mimetype,但csv扩展接收null。 我似乎在谷歌上找不到任何理由来解

  • 我正在使用二分模块搜索并将sha256哈希插入列表。 我有大约8,000,000项要搜索和添加,它们存储在sqlite数据库中,我想把它们读入列表,这样我就可以更快地搜索它们。 我遇到的问题是,使用二分法将项目插入列表以找到正确的插入点非常慢。完成所有8000000个项目大约需要700秒。 按升序在sqlite数据库中创建索引只需要大约90秒,然后依次将索引插入列表大约需要60秒。 问题是当我这样

  • 我在试硒。我已经使用Selenium IDE构建了一个快速脚本。它登录到一个页面,打开一个“搜索”窗口,进行搜索,然后打开其中一个结果。 当我在Selenium IDE中运行测试时,它运行良好。当我导出到Java JUnit 4测试用例时,它运行良好。但当我导出到Python2单元测试时,xpath搜索似乎有很多问题。。。 例子: 该页面有一个名为class='keyword'的输入元素。当我使用