2017-07-25 52 views
1

我有一个Spring引导应用程序站在Postgres数据库上。仅使用H2数据库进行单元测试

现在我想单独使用h2数据库进行单元测试。

这是正确的吗?或什么是建议

+0

针对不同的DBMS进行测试,然后在生产中的测试几乎没有意义 –

+0

@a_horse_with_no_name您能证明实际经验还是仅仅是一种意见?大约200000行H2测试代码(postgres live)帮助我们以非常确定的方式使我们的代码安全可维护。 – aschoerk

+0

哪个引起了你怀疑使用h2进行测试? –

回答

1

我可以推荐。 H2对postgres有一种兼容模式,这使得它非常相似。我们遇到问题的唯一部分是缺乏“共同表格表达”。

我看到的最大优势是内存分贝。您可以轻松地启动每个测试的空白页面,这比使用任何硬盘支持的dbms更容易。

作为现场数据库,尤其是当您需要存储大量数据时,在我看来效率是欠缺的。我们在测试数据量较大的测试中遇到了一些性能问题,例如1000000条记录。正因为如此,你自然不能使用H2做任何有意义的索引优化。

1

是和你也应该使用H2作为内存数据库,因为它允许创造一个干净的数据库足够快,反对和执行单元测试删除数据库足够快test周期时阶段被执行。
在每个构建中创建和删除物理数据库会占用很多时间,并且会使您的本地构建变得缓慢

现在,自动测试不应该只依赖于H2
这有一些限制可以创建略有不同的行为相比,你的目标DBMS(PostgreSQL)。
您还应该创建使用目标DBMS的集成测试。
通常,这些集成测试不应该在开发人员构建中自动执行,而应该在持续集成环境中执行。

H2兼容性和限制

H2提供了一些特定的数据库兼容模式(PostgreSQL和许多其他人),但这些有多个角落的情况。

它支持不完全的ANSI SQL和数据库特有的功能:

兼容性

所有的数据库引擎的行为有所不同。在可能的情况下,H2 支持ANSI SQL标准,并尝试与其他 数据库兼容。但仍有一些差异:

在MySQL文本列默认情况下不区分大小写,而在H2 区分大小写。但是H2也支持不区分大小写的列 。要创建不区分大小写的文本表,请将 IGNORECASE = TRUE添加到数据库URL(例如: jdbc:h2:〜/ test; IGNORECASE = TRUE)。

而且你可能有些不详细信息on this page,关于具体的特定的数据库模式:

兼容模式

对于某些功能,这个数据库可以效仿的 特定数据库的行为。但是,只有数据库之间差异的一小部分以这种方式实现。这里是 目前支持的模式列表和差异为常规模式:

DB2兼容模式

...

MySQL的兼容模式

...

Oracle兼容性模式

...

PostgreSQL的兼容模式

要使用PostgreSQL的模式,使用的数据库URL JDBC:H2:〜/测试; MODE =的PostgreSQL或SQL语句SET MODE 的PostgreSQL 。

对于别名列,ResultSetMetaData.getColumnName()返回 别名,getTableName()返回null。将浮点数 转换为整数时,小数位数不会被截断,但会舍入值。支持系统列CTID和OID 。在此模式下,LOG(x)以10为基数。

相关问题