【问题标题】:What's the appropriate way to test code that uses MySQL-specific queries internally测试内部使用 MySQL 特定查询的代码的适当方法是什么
【发布时间】:2012-06-30 00:07:11
【问题描述】:

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

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

  1. 首先,我想到了简单地使用 Spring-Jdbc 提供的嵌入式数据库功能来实例化嵌入式数据库。我决定使用 H2 实现。由于聚合查询使用 MySQL 特定的内容(例如 DATE() 等时间操作函数),我遇到了麻烦。这种方法的另一个缺点是我需要维护两个 ddl 文件——在 MySQL 中定义表的实际 ddl 文件(这里我定义了编码并将 cmets 添加到表和列,这两个功能都是 MySQL 特定的);以及定义相同表但没有 cmets 等的测试 ddl 文件,因为 H2 不支持 cmets。
  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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        相关资源
        最近更新 更多