我一直在使用 Derby(嵌入式)来测试我的应用程序。它工作正常,但最近它开始给我这样的问题,比如junit test 中的一个 Derby Sequence Loop。
相同的测试在其他数据库(例如 H2)上运行良好。
我的技术栈是 Java 1.6、Spring、Hibernate。
我见过类似数据库(H2、HSQLDB、Derby、PostgreSQL 和 MySQL)的比较,但比较没有提到问题(就像我遇到的问题一样)。
那么,哪一个是用于测试目的的首选?
我一直在使用 Derby(嵌入式)来测试我的应用程序。它工作正常,但最近它开始给我这样的问题,比如junit test 中的一个 Derby Sequence Loop。
相同的测试在其他数据库(例如 H2)上运行良好。
我的技术栈是 Java 1.6、Spring、Hibernate。
我见过类似数据库(H2、HSQLDB、Derby、PostgreSQL 和 MySQL)的比较,但比较没有提到问题(就像我遇到的问题一样)。
那么,哪一个是用于测试目的的首选?
最好的测试数据库是您在生产中运行的相同类型的相同版本,在相同的主机操作系统和架构上。
问题实际上往往是“您在测试而不是生产中有哪些要求让您考虑使用不同的数据库”?
例如,您可能想要一个嵌入式数据库,您可以在单元测试控制下轻松启动和销毁,而无需指定外部二进制文件的路径、启动和停止数据库服务器等。作为交换,您接受一个妥协,即您的测试是与您将运行的真实系统不太匹配。
当我在 Java 应用服务器上构建软件时,我对 PostgreSQL 进行了测试,就像生产机器一样。initdb
和数据库并不难pg_ctl start
;如果你真的觉得有必要,你甚至可以从测试包装器中做到这一点。我认为人们有点过于关注完全进程内的嵌入式数据库,并且没有正确考虑其成本。
我理解有些人认为最好始终使用同一个数据库。但是有几个缺点:
当然,使用不同的数据库进行单元测试也有缺点。如果您使用特定于数据库的功能,则存在无法运行某些测试或测试的行为方式不完全相同的风险。因此,我建议使用与生产环境相同的数据库运行每晚构建。
特别是如果您使用的是 Hibernate 等数据库抽象层,切换数据库应该非常容易。在这种情况下,考虑内存数据库(例如 H2、HSQLDB 或 Derby)确实很有意义。特别是如果您考虑编写许多(或更长时间运行的)测试。