【发布时间】:2014-03-31 13:17:45
【问题描述】:
我正在开发一个测试不同 Web 服务的应用程序,我希望它尽可能通用。我需要填充数据库来进行 JUnit 测试,但我不希望提交这些更改。 我知道一些内存数据库(如 HSQL DB)允许在某种虚拟(或模拟)数据库上进行测试,但不幸的是,我使用的是 oracle,由于我的数据表结构复杂,我现在无法更改它。
您建议的最佳做法是什么? 谢谢。
【问题讨论】:
标签: java database web-services junit
我正在开发一个测试不同 Web 服务的应用程序,我希望它尽可能通用。我需要填充数据库来进行 JUnit 测试,但我不希望提交这些更改。 我知道一些内存数据库(如 HSQL DB)允许在某种虚拟(或模拟)数据库上进行测试,但不幸的是,我使用的是 oracle,由于我的数据表结构复杂,我现在无法更改它。
您建议的最佳做法是什么? 谢谢。
【问题讨论】:
标签: java database web-services junit
首先,HSQL 和 Hibernate 没有任何关系。问题是您能否找到一个嵌入式数据库,它支持与您的生产数据库相同的 SQL(或者更确切地说是您的应用程序使用的 SQL 子集)。
H2 database 是一个很好的候选者,因为它模拟了许多不同的 SQL 风格。
最重要的是:不要测试数据库。假设您的供应商对数据库进行了彻底的测试并且可以正常工作。
在我的代码中,我的目标是:
保存并加载每个实体。
为我使用的所有查询生成 SQL,并将它们与测试中的字符串文字进行比较(即我不会一直对数据库运行查询)。
某些测试会查找系统属性。如果已设置,那么他们将对数据库运行查询。这发生在我的 CI 服务器上的夜间。
这样做的理由:只要数据库架构没有改变,实际运行查询就没有意义。这意味着在白天我坐在电脑前运行它们是一种巨大的时间浪费。
为了确保“低影响”的更改不会漏掉,我让计算机在我不关心的时候运行它们。
同样,我对许多返回各种预定义结果的 DAO 进行了模拟,因此我不必查询数据库。这里的基本原理是我想测试对数据库结果的处理,而不是 JDBC API、DB 驱动程序、操作系统的 TCP/IP 堆栈、网络硬件(和软件),或者我之间的 1000 件事情中的任何其他事情代码和数据库记录在某处的硬盘上。
更多详情见我的博客:http://blog.pdark.de/2008/07/26/testing-with-databases/
【讨论】: