首页 > 解决方案 > 调用空手道特征文件返回响应对象,包括父场景的先前响应对象的多个副本

问题描述

我正在研究执行复杂场景时 JAVA 堆大小的指数增长,尤其是在多个可重用场景中。这是我尝试通过简单的示例和对 JVM 堆使用的可能解释来解决问题。

环境:空手道 1.1.0.RC4 | JDK 14 | Maven 3.6.3

示例:根据自述文件下载项目,提取并执行maven命令

观察:根据以下示例,如果我们多次调用相同的场景,响应对象会呈指数增长,因为它包括来自先前调用的场景的响应以及全局变量的副本。

  @unexpected
  Scenario: Not over-writing nested variable
    * def response = call read('classpath:examples/library.feature@getLibraryData')
    * string out = response
    * def resp1 = response.randomTag
    * karate.log('FIRST RESPONSE SIZE = ', out.length)

    * def response = call read('classpath:examples/library.feature@getLibraryData')
    * string out = response
    * def resp2 = response.randomTag
    * karate.log('SECOND RESPONSE SIZE = ', out.length)

Output:
10:26:23.863 [main] INFO  c.intuit.karate.core.FeatureRuntime - scenario called at line: 9 by tag: getLibraryData
10:26:23.875 [main] INFO  c.intuit.karate.core.FeatureRuntime - scenario called at line: 14 by tag: libraryData
10:26:23.885 [main] INFO  com.intuit.karate - FIRST RESPONSE SIZE =  331 
10:26:23.885 [main] INFO  c.intuit.karate.core.FeatureRuntime - scenario called at line: 9 by tag: getLibraryData
10:26:23.894 [main] INFO  c.intuit.karate.core.FeatureRuntime - scenario called at line: 14 by tag: libraryData
10:26:23.974 [main] INFO  com.intuit.karate - SECOND RESPONSE SIZE =  1783 
10:26:23.974 [main] INFO  c.intuit.karate.core.FeatureRuntime - scenario called at line: 9 by tag: getLibraryData
10:26:23.974 [main] INFO  c.intuit.karate.core.FeatureRuntime - scenario called at line: 14 by tag: libraryData
10:26:23.988 [main] INFO  com.intuit.karate - THIRD RESPONSE SIZE =  8009 
  1. 我们真的需要在被调用的特性文件(非共享范围)的响应中包含响应和全局变量吗?
  2. 当我们读取大型 json 文件并调用多个可重用的场景文件时,每次读取的 json 数据的副本都会添加到响应对象中。有没有办法避免这种行为?
  3. 有没有更好的方法来使用可重用的场景编写复杂的测试脚本,而不需要多个相同变量的副本?

标签: karate

解决方案


好的,能不能看看这个问题:

https://github.com/intuit/karate/issues/1675

我同意我们可以优化响应和全局变量。如果您可以贡献代码,那就太好了。


推荐阅读