如何使用 H2 内存数据库编写单元测试

Posted

技术标签:

【中文标题】如何使用 H2 内存数据库编写单元测试【英文标题】:How to write unit tests with H2 in-memory database 【发布时间】:2019-02-21 08:34:44 【问题描述】:

我的问题可能有点奇怪,但我真的不知道如何为我已经存在的应用程序编写单元测试(我知道我应该先编写单元测试,然后再编写主源代码)。

我的应用程序包含一些表,这些表将从我的 Java 类中自动创建。我的生产数据库是 PostgreSQL。

现在,我想用我的 H2 数据库编写一些单元测试。 但是,我使用了一些 H2 不支持的数据类型(一些特殊的注释 - 日期/时间)。

我现在应该用正确的数据类型在我的测试包中编写错误的新模型类,以便 H2 能够创建表吗? 还是有其他我不知道的方法?

非常感谢您提前提供的帮助和提示!

【问题讨论】:

【参考方案1】:

很遗憾看到您的问题被否决而没有任何讨论原因。其他人是否认为它不清楚或不够充实?很难说。

我想建议编写不正确的模型类以便 H2 可以代替 Postgress 是一个坏主意。这可能会导致测试套件和难以维护的生产代码之间的阻抗不匹配。基于不正确模型的更重要的测试可能不会测试任何有用的东西。他们可能在学习数据库而不是模型或任何关于应用程序的重要内容。最后一点,假设您或其他人想在未来的某个时候参加性能基准测试;使用不正确的模型对错误的 dbms 进行测试将毫无用处。

我更喜欢在整个管道中坚持使用相同的 dbms - dev、test、staging、prod 等。我知道为了速度或出于许可问题在某些地方使用不同的数据库并不少见,但是如果我不必这样做,我不会。在你的情况下,我可以想到几个选项。

    嵌入式 Postgress。我见过 several projects 用于嵌入 Prostgres。环顾四周,多试几次,然后选择合适的。

    尝试使用 RAM 磁盘或tmpfs。 Linux 可以创建基于内存的文件系统;创建一个,挂载它并让 Postgres 使用它。做一些测试,看看它是否真的提供了显着的性能优势。其他操作系统可能也有类似的能力。

    使用标准 Postgress。在 Postgress 的标准安装上运行测试;换句话说,没有什么花哨的,没有过早的优化,只走最简单,最直接的路径。这就是我会做的。

    用 H2 替换 Postgres... 但不要。我同时使用 H2 和 Postgress,我都喜欢它们,但是您已经在 prod 中使用 Postgres,因此没有充分的理由进行更改。

祝你好运。

【讨论】:

非常感谢!它稍微解决了我的问题。谢谢!

以上是关于如何使用 H2 内存数据库编写单元测试的主要内容,如果未能解决你的问题,请参考以下文章

在单元测试时支持 H2 数据库中的 DB2 功能

H2单元测试与业务数据隔离之内嵌模式

如何使用 H2 嵌入式数据库创建 H2 内存数据库

使用 Liquibase 为 Spring Boot 应用程序中的单元测试初始化​​内存 H2

与内存数据库中的同一个 H2 建立多个连接[重复]

在内存数据库中使用 H2 进行 Spring Boot 集成测试