2014-03-31 39 views
0

我正在开发测试不同WebServices的应用程序,我希望它尽可能通用。我需要填充数据库来执行JUnit测试,但我不希望这些更改被提交。 我知道一些像HSQL DB这样的内存数据库允许在一种虚拟(或模拟)数据库上进行测试,但不幸的是我使用了oracle,而且由于我的复杂数据表结构,我现在无法更改它。使用模拟数据库进行JUnit测试

您建议的最佳做法是什么? 谢谢。

回答

1

首先,HSQL和Hibernate没有任何关系。问题是您是否可以找到支持与您的生产数据库相同的SQL的嵌入式数据库(或者说您的应用程序使用的SQL的子集)。

这是一个很好的候选人,因为它模拟了很多不同的SQL风格,所以它是H2 database

最重要的是:不要测试数据库。假设数据库已经过供应商的彻底测试并且正常工作。

在我的代码,我的目标为:

  1. 保存和载入每个实体。

  2. 为我使用的所有查询生成SQL,并在测试中将它们与字符串文字进行比较(即,我不会始终对数据库运行查询)。

  3. 一些测试寻找一个系统属性。如果已设置,则他们将针对数据库运行查询。这发生在我的CI服务器的夜晚。

这样做的基本原理:只要数据库模式没有改变,实际运行查询就没有意义了。这意味着在我坐在电脑前白天运行它们是非常浪费时间的。

为了确保“低影响”变化不会漏过缺口,我让计算机在我不在意的时候运行它们。

沿着同样的路线,我嘲笑了许多返回各种预定义结果的DAO,所以我不必查询数据库。这里的基本原理是,我想测试数据库结果的处理,而不是JDBC API,数据库驱动程序,操作系统的TCP/IP堆栈,网络硬件(和软件)或我之间的1000件事代码和数据库记录在某个硬盘上。

更多细节在我的博客:http://blog.pdark.de/2008/07/26/testing-with-databases/

+0

但我认为这将是很难导入H2我复杂的Oracle数据库架构,是不是有其他的选择吗? – Mouna

+0

如果你想做这样的事情,那么付出的代价就很高,无论如何。要么你需要一种从单元测试中创建Oracle实例的方式,或者你需要刷新数据库并加载它(这有点简单),或者你需要遵循我的方法。 –