什么是适当的方式来测试代码,使用MySQL特定的查询内部(What's the approp

2019-07-30 04:13发布

我收集数据和这些数据存储在使用Java MySQL数据库。 此外,我使用Maven构建项目,TestNG的一个测试框架,而Spring-JDBC访问数据库。 我实现了封装了对数据库的访问一个DAO层。 除了使用DAO类我要执行哪个汇总数据的一些查询和存储在一些其他表中的结果将数据(如物化视图)。

现在,我想写一些测试用例该检查DAO类是否他们应该工作。 因此,我想用一个内存数据库,这将与一些测试的数据来填充的。 由于我也使用MySQL特定的SQL查询的汇总数据,我去了一些麻烦:

  1. 首先,我想过简单地使用由Spring-JDBC提供的嵌入式数据库功能来实例化一个嵌入式数据库。 我决定用H2执行。 在那里,我遇到了麻烦,因为聚集查询,这是使用MySQL特定内容(如时间操作功能,如DATE())。 这种方法的另一个缺点是,我要维护两个DDL文件 - 实际DDL文件中定义在My​​SQL(这里我定义编码并添加注释,以表和列,这两个功能是MySQL特有)的表; 并且定义了相同的表,但没有注释等,因为H2不支持评论测试DDL文件。
  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. 我删除所有MySQL特有的东西出来的SQL查询和使用H2作为测试的嵌入式数据库。 如果这个选项是正确的选择,我需要找到另一种方式来测试数据汇总到物化视图的SQL查询。
  3. 或者是有,我不记得某第三个选择吗?

我将不胜感激任何提示。

谢谢,XComp

Answer 1:

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

此外,使他们不是普通Maven构建的一部分,真正的MySQL数据库的测试可以被配置为集成测试在一个单独的Maven的轮廓。 在CI服务器,您可以创建一个定期运行MySQL的测试额外的工作,如每天或每隔几个小时。 有了这样的设置,你可以保持和测试特定的产品的查询,而你的正规版本将不会减慢。 您也可以运行正常生成即使测试数据库不可用。

有集成测试称为一个不错的Maven插件Maven的故障保护,插件 。 它提供了一种可以在之前的测试数据的测试,以及清理试验后的数据库被用来设置前和后集成测试步骤。



Answer 2:

我创建了Maven插件正是为了这个目的: jcabi-mysql-maven-plugin 。 它开始在本地MySQL服务器pre-integration-test阶段,并关闭它在post-integration-test



文章来源: What's the appropriate way to test code that uses MySQL-specific queries internally