如何记录和重用JUnit测试的数据库结果

时间:2011-12-07 09:16:45

标签: java database testing junit

我想利用现有数据库作为JUnit测试数据的来源。有些场景非常复杂,手动设置所有对象都很麻烦。

我正在考虑我现有DAO的装饰器,它将序列化我真正的SQL连接DAO从数据库返回的对象,并将它们记录到文件中。

在记录一次模式下运行JUnit测试用例,然后总是重放记录的数据,而不是去数据库。

是否有Java框架可以简化此过程,还是我必须自己实现它?

3 个答案:

答案 0 :(得分:3)

使用序列化框架(丑陋的内置Java Serialization API或XML或JSON映射器)将bean转换为文件并返回。许多现代框架只需要很少的提示就可以完成他们的工作。

选项:

JSON:GsonJackson
XML:SimpleWoodstox

这样,您根本不需要进入JDBC。我总是尽量避免测试数据库 - 供应商应该这样做。我的测试只测试我是否正确使用数据库。为此,我只需要检查查询构建器是否生成了正确的SQL字符串(但我不需要将它们发送到数据库)。

在测试数据库(通过JDBC驱动程序将数据发送到实际数据库)时,测试用例应该尽可能小和简单。我总是针对包含测试用例和没有生产数据的特定测试数据库运行测试。不同之处在于测试数据库的每一行都有一个目的。生产数据库包含案例A一百万次,B一次,C丢失,因为它非常罕见。

说“我想对生产数据库的副本进行测试”是一种礼貌的方式,说“我不知道我在做什么,所以我做了很多。”

第一次测试运行时,测试数据库将从头开始重建(静态代码块是您的朋友)。这可以防止人们将它用于任何事情。每个开发人员都有他/她自己的实例。

如果您有一个复杂的存储过程,请将其视为任何其他Java代码:使用最简单的测试数据测试每个路径。

所有这些规则只有两个目标:让每个人在编写打到真实数据库的测试之前三思而后行 - 然后再做出决定。第二个目标:如果测试使用数据库,它将在大多数时间内成功。

答案 1 :(得分:2)

您可以在应用程序和数据库之间设置日志记录JDBC代理(如JdbcProxylog4jdbcjdbcdslogDbdaTestDriver)以保存查询和结果集回。您不必编写和注入任何DAO装饰器。

稍后,您可以使用记录的数据来设置存根数据库连接以供测试使用。 JdbcProxy和DbdaTestDriver都有内置函数来做到这一点。

[编辑] 此项目允许记录JDBC操作并稍后播放:http://sourceforge.net/projects/dbdatestdriver/

答案 2 :(得分:0)

使用测试数据库。使用Jailer提取要用于测试的数据。使用DBUnit设置测试数据库。