测试:最佳嵌入式数据库使用

时间:2013-07-09 08:04:10

标签: postgresql hsqldb derby h2 embedded-database

我一直在使用Derby(嵌入式)来测试我的应用程序。它工作正常,但最近它开始给我这样的问题Derby Sequence Loop in junit test

同样的测试与其他数据库(例如H2)运行良好。

我的技术堆栈是Java 1.6,Spring,Hibernate。

我见过类似数据库(H2,HSQLDB,Derby,PostgreSQL和MySQL)的比较,但比较并没有提到问题(就像我面对的那样)。

那么,哪一个是用于测试目的的首选?

2 个答案:

答案 0 :(得分:4)

最佳测试数据库与您在生产中运行的相同类型的相同版本,在相同的主机操作系统和体系结构上。

问题实际上是“你在测试中有什么要求,而不是让你考虑不同数据库的生产”?

例如,您可能需要一个嵌入式数据库,您可以在单元测试控制下轻松启动和销毁,而无需指定外部二进制文件的路径,启动和停止数据库服务器等。作为交换因为你接受了一个折衷方案,即你的测试与你正在运行的真实系统不太匹配。

当我在Java应用服务器上构建软件时,我对PostgreSQL进行了测试,就像生产机器一样。这并不像initdbpg_ctl start DB很难;如果你真的觉得有需要,你甚至可以从测试包装器中做到这一点。我认为人们过于专注于完全进行中的嵌入式数据库,并且没有适当考虑其成本。

答案 1 :(得分:2)

据我所知,有些人认为总是使用同一个数据库会更好。但是有一些缺点:

  • 当每个数据库调用通过TCP / IP时,单元测试可能会非常慢。
  • 运行测试可能会更复杂,因为您需要安装和运行与本地计算机上的生产相同的数据库。
  • 用于生产数据库的数据库可能需要大量内存,而开发人员机器上可能不需要这些内存。
  • 您可能会无意中使用仅在一个数据库上可用的功能,这将很难切换到另一个数据库(如果您考虑将来这样做)。

使用不同的数据库进行单元测试当然也有缺点。如果使用特定于数据库的功能,则存在无法运行某些测试或测试行为不完全相同的风险。因此,我建议使用与生产相同的数据库运行每晚构建。

特别是如果您使用的是Hibernate等数据库抽象层,那么切换数据库应该非常简单。在这种情况下,考虑内存数据库(如H2,HSQLDB或Derby)确实很有意义。特别是如果您考虑编写许多(或更长时间运行)测试。