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