【问题标题】:What is the proper way to do integration testing in Spring MVC and Hibernate based web aplication在 Spring MVC 和基于 Hibernate 的 Web 应用程序中进行集成测试的正确方法是什么
【发布时间】:2015-12-28 08:55:24
【问题描述】:

我们决定在我们的 Web 应用程序中实现集成测试。 Web 应用程序基于 java、spring、spring MVC、hibernate 和 mysql。

当我对它进行一些研究时,我发现很多人都在使用 dbunit。我发现的另一种方法是使用像 H2 这样的嵌入式数据库?

我发现很少有人使用单独的测试数据库进行集成测试。

那么,设置数据库进行集成测试的理想方法是什么?

【问题讨论】:

  • 您最好使用与生产中使用的数据库相同的数据库,否则您将测试您的应用在 H2 上运行良好,虽然它不能在生产中运行在 H2 上,但在 MySQL 上运行,这是一个完全不同的数据库。有什么意义?
  • 但是 live 或 dev db 中的数据会不断变化。那么,我们如何针对不断变化的数据编写测试呢?
  • 我不确定,但是否可以仅对测试使用相同的数据库但一些预定义/不同的数据?
  • 你误解了我的意思。不要使用相同的数据库实例。使用相同的数据库产品。 IE。使用 MySQL 的本地实例,填充测试数据。要设置测试数据,我会使用 DbSetup。免责声明:我是作者。 dbsetup.ninja-squad.com
  • 哦,对不起。调查 dbsetup。

标签: spring spring-mvc integration-testing spring-test dbunit


【解决方案1】:

让您测试的数据库与您打算在生产中使用的数据库保持一致似乎是个好主意,而且它确实具有以下优势,即出现的所有问题都与实际使用的数据库相关在生产中。但是您已经在使用 Hibernate 作为代码和数据库之间的抽象层,因此可以切换运行测试所针对的数据库。

在集成测试中使用非嵌入式数据库的一个问题是,它会使在持续集成环境中运行测试变得更加困难。在这种情况下,使用嵌入式数据库要方便得多,因为数据库实例是专门由当前运行的集成测试创建、填充和调用的,并且不同进程访问同一个数据库时不会出现问题,并且可能相互改变数据。

此外,在测试运行之前设置非嵌入式数据库可能会大大增加运行测试所需的时间,因为嵌入式数据库不会将任何内容保存到磁盘上,因此设置不会花费很长时间,并且测试可以跑得更快。

(这对 MySQL 来说不是问题,但是当生产中使用的数据库是像 Oracle 这样的专有数据库,由于许可而难以创建新实例时,嵌入式数据库是一个更具吸引力的选择。)

使用 H2 和使用 DBUnit/DBSetup 不一定是单独的方法,它们经常一起使用。 DBUnit 和 DBSetup 是用于填充数据库内容的工具,以便测试可以针对处于已知状态的数据执行。您可以将其中任何一个与 H2 结合使用,以便测试与位置无关(不依赖外部共享数据库)、快速执行并针对定义明确的数据集运行。无论您是否使用嵌入式数据库,最好使用 DBUnit 或 DbSetup 之类的工具来明确定义测试将针对哪些数据运行。

【讨论】:

  • 在 Hibernate/ORM 的情况下,集成测试的目标是测试映射/注释和实体 bean,它们代表数据库驱动程序的集成层。由于 hibernate 承诺将有关选择实际数据库供应商的顾虑分开,因此他确实可以针对不同于他将在生产中使用的数据库执行集成测试 - 当然,除非他在其 ORM 层中使用供应商特定的配置。跨度>
【解决方案2】:

您使用“集成测试”这个短语,所以也许您确实想要测试数据库……但一般来说,您最好测试您的应用程序代码,而不是您的数据库驱动程序。为了允许测试依赖于数据库的应用程序代码,Mockitopowermock 等模拟工具使您能够伪造 DB 调用(您可以让 DB 方法返回您想要的任何内容)并允许您编写测试专注于业务逻辑。

【讨论】:

    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多