Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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
Java 用于集成测试的容器内测试与模拟对象_Java_Testing_Mocking_Integration Testing_Application Server - Fatal编程技术网

Java 用于集成测试的容器内测试与模拟对象

Java 用于集成测试的容器内测试与模拟对象,java,testing,mocking,integration-testing,application-server,Java,Testing,Mocking,Integration Testing,Application Server,容器内测试通常与模拟对象的测试相反。然而,由于模拟对象只是模仿真实对象的行为,容器内测试不是在“真实环境”中真正测试系统的唯一方法吗 作为容器内测试和模拟对象的部分替代,Spring提供了TestContext框架,该框架可以很好地初始化Spring,而无需启动实际的应用程序容器(在我的例子中是web应用程序服务器)。然而,这是一种有限的方法,因为它只初始化特定于Spring的特性,而不支持特定于应用服务器的特性。所以你不能测试所有东西。另外,由于它与实际web执行中使用的默认WebApplic

容器内测试通常与模拟对象的测试相反。然而,由于模拟对象只是模仿真实对象的行为,容器内测试不是在“真实环境”中真正测试系统的唯一方法吗

作为容器内测试和模拟对象的部分替代,Spring提供了
TestContext
框架,该框架可以很好地初始化Spring,而无需启动实际的应用程序容器(在我的例子中是web应用程序服务器)。然而,这是一种有限的方法,因为它只初始化特定于Spring的特性,而不支持特定于应用服务器的特性。所以你不能测试所有东西。另外,由于它与实际web执行中使用的默认
WebApplicationContext
不是100%相同,这种方法不是有点老套吗?坏吗

对于容器内测试,至少有(过时的),(一个非常小的项目)和(仍然是alpha,但看起来很有希望)。我不认为这些项目中有任何一个应用得太广泛,所以容器内测试有什么不好的地方吗?容器内测试经常提到的主要缺点是执行速度慢。然而,当在持续集成环境和相对较小的项目中运行时,这应该不是问题

总结一下:我们应该做容器内测试还是容器外测试?为什么?在集成测试中使用模拟对象或替代初始化机制(如SpringTestContext)会让您感觉不好吗


子注:我最近询问了,这可能是相关的。

我认为我们应该做容器内和容器外测试。我发现在容器中进行测试的主要问题是,自动化所有内容需要做更多的工作。通过Spring的集成测试支持,您可以获得一些更便宜的收益,但我们不应该自欺欺人地认为,这涵盖了在部署容器中进行测试的所有内容

关于mock的主题,我发现它们可以在与Spring的集成测试中发挥作用,但我更倾向于使用假/存根服务和固定结果进行集成和容器内测试(我称之为系统测试)

如果你不确定模仿和存根的区别,看看这个

然而,由于模拟对象只是模仿真实对象的行为,容器中的对象不是吗 测试是在“真实环境”中真正测试系统的唯一方法吗

我想简短的回答是肯定的,但是。。。我认为你的“集成测试分类”问题非常相关。单元测试和集成测试都很重要,尽管它们的功能不同

单元测试与代码密切相关,应该快速启动和运行,应该经常由开发人员在代码上迭代运行,并且通常高度使用模拟。其思想是测试有问题的代码,而不是测试其依赖项或集成点。让单元测试都在容器中的问题是,它们运行的频率会降低,或者会浪费太多的开发人员时间

我们已经将容器内/集成测试隔离在另一个项目的其他地方,这些项目依赖于代码项目。它们被设计成尽可能地模拟生产配置。这些测试需要更长的设置时间、更长的运行时间,并且对于通过类似的方式运行更有用。它们是手工运行的,尤其是当我们接近发布或开发稳定后。我经常在午餐或开会时启动集成测试。当一个集成测试发现一个bug时,我们会尝试编写一个单元测试,用模拟来演示这个bug——这通常是很困难的,而且可能是不可能的

我们通常会进行一些小型的容器内测试和单元测试,以确保spring配线正常工作或测试一些基本功能,但其余的集成测试将在另一个项目中完成


尽管如此,两者之间并没有明显的区别。有时,我们移动只处理大量数据的单元测试,并花费很长时间进行集成测试,有时集成测试运行速度足够快,并且有价值,可以与代码一起包含。

我完全可以在容器外运行单元测试。事实上,我不明白你为什么要运行“几个小型容器内单元测试”来测试“弹簧接线”之类的东西?也许你输入了,你的意思是“几个小型容器内集成测试”?另外,我是否理解正确:如果运行时配置发生更改,您必须将该设置复制到集成测试项目中?您实际上如何运行/初始化容器内测试?也许在某个框架的帮助下?我已经编辑了这个部分。我的意思是,我们在单元测试集合中有几个集成测试,以确保所有的Spring布线都能正常工作。所有配置文件都与代码在一起——我们不会将任何配置复制到集成项目中。集成项目与生产代码共享相同的包路径,因此可以加载所有相同的src/main/resource(我们使用的是mvn)配置。您在容器内测试中使用了什么库?让我感到困惑的是,每个容器内测试框架(Cactus、jeeunit、Arquillian)似乎都实现了对不同技术的特定支持,如CDI、EJB、Servlet等。难怪要支持所有需要额外配置的功能:/感谢指向本文的指针,我得承认我在这件事上经验很少。