仅使用H2数据库进行单元测试

时间:2017-07-25 05:18:13

标签: postgresql unit-testing spring-boot h2

我有一个Spring Boot应用程序站在Postgres数据库上。

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

这是对的吗?或者推荐是什么

2 个答案:

答案 0 :(得分:2)

是和您还应该使用H2作为内存数据库,因为它允许足够快地创建干净的数据库,以执行针对执行test循环阶段时,>足够快地删除数据库 在每次构建时创建和删除物理数据库会消耗很多时间,并且会使本地构建变慢

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

H2兼容性和限制

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

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

  

<强>兼容性

     

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

     

在MySQL文本列中,默认情况下不区分大小写,而在H2中   他们区分大小写。但是,H2支持不区分大小写的列   同样。要创建具有不区分大小写的文本的表,请附加   IGNORECASE = TRUE到数据库URL(例如:   JDBC:H 2:〜/测试; IGNORECASE = TRUE)

关于特定的特定数据库模式,您可以获得一些未详细信息on this page

  

兼容模式

     

对于某些功能,此数据库可以模拟其行为   特定数据库。但是,只有一小部分差异   数据库之间以这种方式实现。这是列表   当前支持的模式以及与常规模式的差异:

     

DB2兼容模式

     

...

     

MySQL兼容模式

     

...

     

Oracle兼容模式

     

...

     

PostgreSQL兼容模式

     

要使用PostgreSQL模式,请使用数据库URL   jdbc:h2:〜/ test; MODE = PostgreSQL或SQL语句SET MODE   的PostgreSQL。

     

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

答案 1 :(得分:1)

我可以推荐一下。 H2对postgres有一种兼容模式,这使它非常相似。我们遇到问题的唯一部分是缺少&#34;常用的表格表达式&#34;。

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

作为实时数据库,尤其是当您需要存储大量数据时,我认为效率不足。在数据量较大的测试中,我们遇到了一些性能问题,例如1000000条记录。因此,您自然无法使用H2进行任何有意义的索引优化。