【问题标题】:Using H2 database only for Unit testing仅将 H2 数据库用于单元测试
【发布时间】:2017-12-30 20:37:26
【问题描述】:

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

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

这样做对吗?或者有什么建议

【问题讨论】:

  • 针对不同的 DBMS 进行测试然后生产中的 DBMS 几乎毫无意义
  • @a_horse_with_no_name 你能用实际经验证明这一点还是只是一种观点?大约 200000 行使用 H2 的测试代码(postgres live)以非常确定的方式帮助我们使我们的代码安全且可维护。
  • 是什么让你怀疑使用h2进行测试?
  • 在此处的类似帖子中查看我的答案:stackoverflow.com/a/55862900/2629588

标签: postgresql unit-testing spring-boot 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:~/test;MODE=PostgreSQL 或 SQL 语句 SET MODE PostgreSQL。

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

【讨论】:

    【解决方案2】:

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

    我看到的最大优势是内存数据库。您可以从一张白纸轻松地开始每个测试,这比使用任何硬盘支持的 dbms 容易得多。

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

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 2015-04-06
      • 2019-11-15
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 2011-04-27
      相关资源
      最近更新 更多