当前位置: 首页 > 知识库问答 >
问题:

在集成测试结束时停止空手道模拟服务器

程赞
2023-03-14

我正在使用空手道为Spring Boot应用程序进行集成测试。应用使用另外两个服务(服务A和服务B)。我已经为服务A和服务B编写了空手道模拟。我的集成测试是作为两个不同的功能文件编写的。其中一个特性是使用服务A和服务B的Mocks测试的。另一个特性使用服务B的Mocks和服务A的Spring契约存根。

仅具有模拟的功能

 Feature: Test Some feature

  Background:
    * configure headers = { Content-Type: 'application/json' }
    * url baseUrl

 #Start up the mocks
  Scenario: Start the Mocks
    * karate.start({ mock: '../mock/service/service-a.feature', port: 9000})
    * karate.start({ mock: '../mock/service/service-b.feature', port: 9001})

具有mock和Spring契约存根的特性

 Feature: Test Some more features

  Background:
    * configure headers = { Content-Type: 'application/json' }
    * url baseUrl

 #Start up the mocks
  Scenario: Start the Mocks
    # Service A will use Spring Contract stubrunner. 
    * karate.start({ mock: '../mock/service/service-b.feature', port: 9001})

现在,当我们运行测试时,第二个失败了,说端口已经被使用了。我尝试在首先运行的功能文件的末尾使用karate.stop(9000),但它没有帮助。此外,我不确定这种停止方法的行为。有什么解决这个问题的建议吗?为什么模拟服务在测试完成后仍在运行?

共有1个答案

卫阳曜
2023-03-14

据我所知,当JVM退出时,模拟应该停止——因此我无法解释您的情况。因此,也许您应该创建一种复制和归档bug的方法:https://github.com/intuit/karate/wiki/How-to-Submit-an-Issue

我个人建议从单元测试Java代码(通常是JUnit类)开始模拟,这意味着您可以保留对模拟的引用,然后对其调用stop()。即使在这里,它通常也不是强制性的,因为mock应该随JVM一起终止。请阅读此处的文档:https://github.com/intuit/karate/tree/develop/karate-netty#embedding

然后,请注意,最佳实践是动态预配一个端口,然后将其传递给测试或任何其他消费者。特别是在CI-CD管线中,这避免了使用中的端口或花费太多时间去分配的问题。

也许是你想要的直接答案。当你叫空手道时。start()返回一个类型为MockServer的对象。因此,您可以保留对它的引用,并在需要时对其调用stop():https://github.com/intuit/karate/tree/develop/karate-netty#within-空手道测试

例如:

* def server1 = karate.start('mock1.feature')
* def port1 = server1.port
# do some tests
* server1.stop()
 类似资料:
  • 我试图利用空手道(https://github.com/intuit/karate)作为测试容器化、基于云的微服务的整体测试策略中的一个关键组件。假设被测微服务和空手道都有自己的容器,流程如下: 获取本地部署的每个容器 构建(通过gradle)空手道容器中的组件(假设我们的模拟需要Java类) 部署(通过gradle)模拟并让它们在独立模式下运行 向微服务的YAMLs中注入有关模拟的信息 本地构建

  • 当我用空手道开始模拟发球时,有没有办法将端口设置为我想要的端口。启动,而不是像这样获取端口,这将在某个端口启动服务器并返回它: 有类似的可能性:

  • 我正在用两个应用程序做project:android应用程序(客户端)和rest服务(服务器)。我的android应用程序消耗了我的rest服务。 这两个应用程序都是单独测试的,以确保它们按照预期完成业务。在服务器测试期间,我准备请求并检查服务器响应。在客户机测试期间,我设置了一个简单的http模拟服务器,并针对不同的模拟响应测试客户机的请求。 现在,这个技术很管用。它给了我一种我喜欢的灵活性。我

  • 如何模拟集成测试所需的许多依赖关系? 我使用Mockito进行纯单元测试。在这种情况下,Pure意味着测试一个类,嘲笑它的所有依赖关系。漂亮。 现在是集成测试。假设在这种情况下,集成测试将测试以下内容: 消息被放入队列 我们也可以说,在第2步中发生的处理是严肃的事情。它依赖于大量的数据库交互、多种外部服务、文件系统,以及各种各样的东西。流还会引发很多副作用,所以我不能简单地确保响应是正确的——我需

  • 情况和问题:在Spring Boot中,我如何将一个或多个模拟类/bean注入应用程序以进行集成测试?在StackOverflow上有一些答案,但它们集中在Spring Boot 1.4之前的情况,或者只是不适合我。 背景是,在下面的代码中,设置的实现依赖于第三方服务器和其他外部系统。设置的功能已经在单元测试中测试过了,所以对于完整的集成测试,我想模拟出对这些服务器或系统的依赖,只提供虚拟值。 M