Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SpringMVC和基于Hibernate的web应用程序中进行集成测试的正确方法是什么_Spring_Spring Mvc_Integration Testing_Spring Test_Dbunit - Fatal编程技术网

在SpringMVC和基于Hibernate的web应用程序中进行集成测试的正确方法是什么

在SpringMVC和基于Hibernate的web应用程序中进行集成测试的正确方法是什么,spring,spring-mvc,integration-testing,spring-test,dbunit,Spring,Spring Mvc,Integration Testing,Spring Test,Dbunit,我们决定在web应用程序中实现集成测试。Web应用程序基于java、spring、SpringMVC、hibernate和mysql 当我对它做一些研究时,我发现很多人都在使用dbunit。我发现的另一种方法是使用嵌入式数据库,比如H2 我发现人们很少使用单独的测试数据库进行集成测试 那么,设置数据库以进行集成测试的理想方法是什么呢?您使用了“集成测试”这一短语,因此您可能确实希望测试数据库……但一般来说,您最好测试应用程序代码,而不是DB驱动程序。为了允许测试依赖于数据库的应用程序代码,模拟工

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

当我对它做一些研究时,我发现很多人都在使用dbunit。我发现的另一种方法是使用嵌入式数据库,比如H2

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


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

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

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

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

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

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


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

您最好使用与生产中使用的数据库相同的数据库,否则您的应用程序在H2上运行良好,尽管它在生产中不在H2上运行,但是在MySQL上,它是一个完全不同的数据库。重点是什么?但是live或dev db中的数据将不断变化。那么,我们如何针对不断变化的数据编写测试呢?我不确定,但是否可以只使用相同的数据库,但某些预定义/不同的数据进行测试?你误解了我。不要使用相同的数据库实例。使用相同的数据库产品。即使用MySQL的本地实例,填充测试数据。要设置测试数据,我将使用DbSetup。免责声明:我是作者。哦,很抱歉。在Hibernate/ORM的情况下,集成测试的目标是测试映射/注释和实体bean,它们代表数据库驱动程序的集成层。由于hibernate承诺分离有关选择实际数据库供应商的问题,因此他确实可以针对不同于生产中使用的数据库执行集成测试,当然,除非他在ORM层中使用特定于供应商的配置。