1

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

相同的测试在其他数据库(例如 H2)上运行良好。

我的技术栈是 Java 1.6、Spring、Hibernate。

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

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

4

2 回答 2

4

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

问题实际上往往是“您在测试而不是生产中有哪些要求让您考虑使用不同的数据库”?

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

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

于 2013-07-09T08:39:14.583 回答
2

我理解有些人认为最好始终使用同一个数据库。但是有几个缺点:

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

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

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

于 2013-07-10T08:00:43.653 回答