繁体   English   中英

如何使用 Spring MVC 控制器作为集成测试的假端点?

[英]How do I use a Spring MVC Controller as a Fake Endpoint for an Integration Test?

我有一个使用java.net.URLConnection调用第三方端点的服务。 作为使用此服务的集成测试的一部分,我想使用我自己构建的假端点。

我制作了一个 Spring MVC 控制器来模拟我需要的端点的行为。 (我知道这个端点按预期工作,因为我将它包含在我的 Web 应用程序的 servlet 配置中,并在启动后从浏览器点击它)。

我无法弄清楚如何让这个假端点可用于我的集成测试。

Spring-Test 是否有一些功能可以帮助我? 我是否需要在测试开始时启动一个 servlet? 完全有其他解决方案吗?

将 Spring MVC 控制器用作假端点是一个坏主意。 没有办法简单地让控制器可用于集成测试,并且仅使用该控制器启动 servlet 以及您正在测试的任何东西都需要大量配置。

使用像 MockServer ( http://www.mock-server.com/ ) 这样的模拟框架来创建你的假端点要好得多。 MockServer 应该足够强大,可以覆盖来自假端点的复杂响应,而设置相对较少。

查看在 3.2 版中添加到 Spring 的 Spring MVC 测试。

这里有一些教程: 1 , 2 , 3

首先,我认为我们应该正确使用术语。 在测试(简化)中有两组通用的“假”对象:一个模拟,它在预定义的输入和存根上返回预定义的答案,存根是 SUT(被测系统)与之通信的对象的简化版本。 虽然模拟基本上只是提供响应,但存根可能会使用实时算法,但不会将其结果存储在数据库中或通过电子邮件发送给客户。 我不是测试专家,但这两个假对象更适合在单元中使用,并取决于它们在验收测试中的范围。

因此,您的 sut 在集成测试期间与远程系统通信。 在我的书中,这是实际测试您的软件如何与其他系统集成的最佳时机,因此您的软件应该针对远程系统的测试版本进行测试。 如果这是不可能的(他们可能没有测试系统),您在概念上会遇到某种麻烦。 您只能以您希望它工作的方式塑造您的存根或模拟,这非常类似于您编写的用于与该远程服务通信的软件部分。 这遗漏了一些您想要使用集成测试进行测试的重要事项: 客户端是否正确实现,以便它可以与实时服务器一起使用。 由于服务器端存在实现错误,我们是否必须制定解决方案? 与远程系统的通信会在多大程度上影响我们的软件性能? 我们的身份验证凭据有效吗? 身份验证机制是否有效? 迄今为止没有人想到这种沟通关系的技术和概念含义是什么? (相信我,后者会比你想象的更频繁!)

一般而言:如果您针对模拟或存根进行集成测试会发生什么情况是您根据自己对如何实现客户端和服务器端通信的理解进行测试,而不是测试您的客户端如何与实际工作远程服务器或至少旁边最好的东西,一个测试系统。 我可以从经验告诉你:永远不要对远程系统的行为做出假设——测试它。 即使在谈论 JMS 服务器时:测试它!

如果您为公司工作,则针对提供的测试系统进行测试更为重要:如果您的软件针对测试系统工作并且您可以证明它(selenium 是这里的好帮手,以及良好的日志记录,请相信它或不),并且您的软件无法与实时版本一起使用,您会遇到一种我称之为“instablame”的情况:很明显,软件无法运行不是您的错。 我自己讨厌用手指指着骨头,但大多数西装往往会问“是谁的错?” 甚至在“我们可以立即解决这个问题吗?” 以及“我们如何解决这个问题?”之前的方式。 还有一个特殊的诉讼组叫做律师,你知道......;)

话虽如此:如果您在集成测试期间绝对必须使用这些存根,我会为它们创建一个自己的项目(假设“ MyProject-IT-Stubs ”并在我之前构建和运行最新版本的MyProject-IT-Stubs运行我的主项目的 IT。在使用 maven 时,您可以创建带有war包装的MyProject-IT-Stubs ,在预集成-测试阶段将其称为依赖项,并在同一阶段为此战争启动码头。然后您的集成测试运行,无论成功与否,您可以在后集成测试阶段拆除码头。

恕我直言,使用 maven 组织您的项目的最佳方法是拥有一个包含三个模块的项目: MyProjectMyProject-IT-StubsMyProject-IT (声明对MyProjectMyProject-IT-Stubs依赖。这使您的项目保持整洁并且存根不会污染您的项目。您可能还想考虑将MyProject-IT-Stubs组织成模块,每个模块对应一个您必须MyProject-IT-Stubs远程系统。一旦您拥有测试访问权限,您就可以简单地停用根据MyProject-IT-Stubs模块。

我确信InsertYourBuildToolHere存在相应的选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM