测试在内部使用特定于MySQL的查询的代码的适当方法是什么

时间:2012-06-28 12:57:15

标签: mysql maven testng embedded-database spring-jdbc

我正在使用Java收集数据并将这些数据存储在MySQL数据库中。另外,我使用Maven构建项目,TestNG作为测试框架,使用Spring-Jdbc访问数据库。我已经实现了一个封装对数据库的访问的DAO层。除了使用DAO类添加数据之外,我想执行一些查询,这些查询聚合数据并将结果存储在其他一些表中(如物化视图)。

现在,我想编写一些测试用例来检查DAO类是否正常工作。因此,我想到了一个内存数据库,它将填充一些测试数据。由于我也使用特定于MySQL的SQL查询来聚合数据,我遇到了一些麻烦:

  1. 首先,我想过简单地使用Spring-Jdbc提供的嵌入式数据库功能来实例化嵌入式数据库。我决定使用H2实现。在那里我遇到了麻烦,因为聚合查询使用特定于MySQL的内容(例如时间操作函数,如DATE())。这种方法的另一个缺点是我需要维护两个ddl文件 - 在MySQL中定义表的实际ddl文件(这里我定义了编码并为表和列添加注释,这两个特性都是特定于MySQL的);和测试ddl文件定义了相同的表但没有注释等,因为H2不支持注释。
  2. 我找到了使用MySQL作为嵌入式数据库的描述,我可以在测试用例中使用它(http://literatitech.blogspot.de/2011/04/embedded-mysql-server-for-junit-testing的.html)。这对我来说真的很有希望。不幸的是,它没有用:一个MissingResourceExcpetion发生了“资源'5-0-21 / Linux-amd64 / mysqld'找不到”。似乎驱动程序无法在我的本地计算机上找到数据库守护程序。但我不知道我需要寻找什么来找到解决该问题的方法。
  3. 现在,我有点陷入困境,我想知道我是否应该以不同的方式创建架构。有人提供了一些如何设置合适系统的提示吗?我还有其他两个选择:

    1. 我将使用本机MySQL实例并设置仅用于测试用例的数据库,而不是使用嵌入式数据库。这个选项听起来很慢。实际上,我可能希望稍后设置一个CI服务器,我认为使用嵌入式数据库会更合适,因为测试运行得更快。
    2. 我从SQL查询中删除所有特定于MySQL的东西,并使用H2作为嵌入式数据库进行测试。如果这个选项是正确的选择,我需要找到另一种方法来测试将数据聚合到物化视图的SQL查询。
    3. 或者我有没有第三种选择?
    4. 我很感激任何提示。

      谢谢, XComp

2 个答案:

答案 0 :(得分:8)

我为此专门创建了Maven插件:jcabi-mysql-maven-plugin。它在pre-integration-test阶段启动本地MySQL服务器并在post-integration-test上关闭它。

答案 1 :(得分:2)

如果无法让内存中的MySQL数据库工作,我建议使用H2数据库进行“简单”测试一个专门的MySQL实例来测试特定于MySQL的查询。< / p>

此外,真实MySQL数据库的测试可以在单独的maven配置文件中配置为集成测试,这样它们就不会成为常规maven构建的一部分。在CI服务器上,您可以创建一个定期运行MySQL测试的其他作业,例如每天或每隔几个小时。通过这样的设置,您可以保留并测试特定于产品的查询,而常规构建不会变慢。即使测试数据库不可用,您也可以运行正常构建。

有一个很好的maven插件,用于集成测试maven-failsafe-plugin。它提供了集成前和集成后的测试步骤,可用于在测试之前设置测试数据并在测试后清理数据库。