DBUnit简介
随着JUnit的开发使用,对它进行了许多添加。 这些增加利用了JUnit的可插入性。 这些贡献之一是DBUnit 。 DBUnit使您的单元测试能够:
- 将仅与您当前测试有关的数据预加载到数据库中,
- 像往常一样运行单元测试,
- 删除您预加载的数据,以使数据库与添加之前的数据相同。
实际上,您现在可以测试您的DAO类。 让我们举一个(非常)简单的示例:操作Person
对象的PersonDao
类。
您创建一个扩展org.dbunit.JdbcBasedDBTestCase
。 它迫使您实现以下方法:
-
IDataSet getDataSet() throws Exception
,其中IDataSet
代表表的集合, - 字符串
getConnectionUrl()
返回数据库的连接URL, - 字符串
getDriverClass()
返回用于数据库访问的驱动程序的类名。
通过此过程,您可以使用各种数据集测试DAO类。 此外,可以从各种来源初始化这些数据集:我最近发现这些来源之一可能是Excel文件! 我同意,它不是开源的,但是比那些繁琐的XML文件更易于管理。
但是,这些测试通常是在远程和共享数据库上进行的。 缺点包括:
- 巨大的性能成本:远程数据库使用网络,因此,即使数据库本身表现出色,也要增加获得结果的时间,
- 使用错误数据的风险:如果使用共享数据库,则您可能会误以为要用于测试的数据已被另一位开发人员修改。 如果您的数据库为每个开发人员使用一个架构,那只是配置开销...
第一点是开发人员不要编写数据库测试的好方法,因为他们不能足够快地完成构建。 第二点为正确测试失败或更重要的是为错误测试成功铺平了道路。 两者都不好。
使用备用本地数据库
这些问题的答案是使用备用本地数据库。 但是,该解决方案有其自身的缺点,包括:许可证成本,每个开发人员的计算机的配置开销以及广受欢迎的“在我的计算机上不起作用”。 好吧,让我们回到共享的BD吗? 显然没有:通常有很多选择。
从JVM版本6开始,Sun随其JDK一起提供了一个嵌入式数据库。 这个数据库,最初叫哦,就是JavaDB,是对不太古老的Apache Derby数据库项目的重用。 Apache Derby是完全用Java实现的开源关系数据库。
主要优点是:
- 很小的内存空间
- 主要的SQL-99 Core / SQL-2003必需功能(请参阅表以了解不支持的功能 ),
- 嵌入式驱动程序。
快速入门
首先,您应该提供一种以不同方式提供连接的机制,例如依赖注入,这可能是您为实际项目选择的方法(使用Spring或Guice)。 对于我的概念验证,我选择了方法重载机制以使其保持简单(没有尾随S的KISS )。
然后,一切都非常简单:
-
getConnectionUrl()
应该返回"java:derby:[your_chosen_db_name];create=true"
, -
getDriverClass()
应该返回"org.apache.derby.jdbc.EmbeddedDriver"
, -
getDataSet()
应该非常简单地返回getConnection().createDataSet()
。
等等!
结论
JavaDB的使用并不是解决DB测试问题的金锤。 据我说,要使其完全符合SQL,还有很多事情要做。 但是,可以解析出90%的常用SQL请求。 甚至还有一个休眠方言。 总之,它可以为开发人员节省很多痛苦和时间。 那么,为什么不使用它呢?
翻译自: https://blog.frankel.ch/speeding-up-your-dbunit-tests-with-javadb/