10

我正在收集数据并将这些数据存储在使用 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

4

2 回答 2

8

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

于 2013-10-09T18:02:53.593 回答
2

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

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

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

于 2012-07-08T14:17:34.233 回答