H2 postgresql模式似乎不适合我

嗨,我的应用程序访问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的数据集,则通常应与包含来自另一个数据库的相同数据的数据集相同。当然,只要使用简单的数据类型,而不使用数据库特定的功能。

以上是 H2 postgresql模式似乎不适合我 的全部内容, 来源链接: utcz.com/qa/425275.html

回到顶部