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

XCo*_*omp 9 mysql testng spring-jdbc embedded-database maven

我正在收集数据并使用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'找不到".似乎驱动程序无法在我的本地计算机上找到数据库守护程序.但我不知道我需要寻找什么才能找到解决该问题的方法.

现在,我有点陷入困境,我想知道我是否应该以不同的方式创建架构.有人提供了一些如何设置合适系统的提示吗?我还有两个其他选择:

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

我会很感激任何提示.

谢谢,XComp

yeg*_*256 8

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


Ste*_*stl 2

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

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

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