Karate - 请求多线程访问 - 问题

标签 karate

我在 25 个以上的功能文件中涵盖了 100 多个测试,并且我有 karate-config.js,它具有 3 个“karate.callSingle”函数,如下所示。

config.weatherParams = karate.callSingle(
    "file:src/test/java/utils/AvailableForecasts.feature",
    config
  );
  config.routingParams = karate.callSingle(
    "file:src/test/java/utils/CalculationInput.feature",
    config
  );

  config.vesselParams = karate.callSingle(
    "file:src/test/java/utils/VesselStatus.feature",
    config
  );

当我在 callSingle 中使用类路径时出现同样的问题。

当我在启用并行(随机尝试 1-100 个线程)的情况下一次运行所有测试时,出现以下错误:

org.graalvm.polyglot.PolyglotException: Multi threaded access requested by thread Thread[pool-2-thread-8,5,main] but is not allowed for language(s) js.
- com.oracle.truffle.polyglot.PolyglotEngineException.illegalState(PolyglotEngineException.java:132)
- com.oracle.truffle.polyglot.PolyglotContextImpl.throwDeniedThreadAccess(PolyglotContextImpl.java:727)
- com.oracle.truffle.polyglot.PolyglotContextImpl.checkAllThreadAccesses(PolyglotContextImpl.java:627)
- com.oracle.truffle.polyglot.PolyglotContextImpl.enterThreadChanged(PolyglotContextImpl.java:526)
- com.oracle.truffle.polyglot.PolyglotEngineImpl.enter(PolyglotEngineImpl.java:1857)
- com.oracle.truffle.polyglot.HostToGuestRootNode.execute(HostToGuestRootNode.java:104)
- com.oracle.truffle.polyglot.PolyglotMap.entrySet(PolyglotMap.java:119)

在尝试了多种组合之后 - 令人惊讶的是,当我在 karate.config 中只有 2 个“callSingle”函数(注释 VesselStatus.feature)时,它就可以正常工作。

所有这 3 个“callSingle”事物调用 3 个不同的服务并设置变量以供其他测试运行,因此这 3 个至关重要。

有没有办法,我们可以重新优化/采用不同的方法来避免上述问题?

最佳答案

我在 Karate 实现中遇到了这个问题@peter-thomas。我刚刚找到了解决此问题的简单方法,因为我们知道 graalVM js 引擎不支持 karate-config.js 的多线程

解决方法是 - 我们可以等待一定的毫秒,并且该毫秒必须随机生成。

下面的 karate-config.js 代码请看一下 -

function fn(){

// karate-config essential coding

    var random_millis = Math.floor(Math.random() * 5000 - 1000 +1 )) + 1000;
    java.lang.Thread.sleep(random_millis);
    
    return something;
    
    }

通过上面的代码,我尝试使用 Karate 1.2.0.RC1 运行 20 个并行线程,运行 100 多个功能文件,效果非常好。

它是如何工作的 - 所有 20 个线程将一起跳跃,同时到达 Karate 配置。但如果我们应用一些在 1 到 5 秒(以毫秒为单位)之间过于随机的延迟,所有线程将等待不同的时间,以避免多线程问题。

我还知道,在 1 到 5000 millisends 之间,仍然有 1% 的机会我们得到相同的数字,但在我们得到这个问题的具体解决方案之前,我想我们可以使用这个解决方法。

谢谢, 索拉布

关于 Karate - 请求多线程访问 - 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67871765/

相关文章:

automation - 如何在 Karate 中使用特定于环境的测试数据

java - 从 0.9.6 升级到 1.0.x Karate 版本后,PKIX 路径构建失败

variables - Karate -从另一个特征文件中的响应中获取字段的值

testing - 如何在 Karate DSL 中操作 xml 文件的变量?

javascript - 获取 gherking.lexer.lexingError,当我尝试在 Karate 中使用 javascript 时

apache-kafka - Karate:将字符串转换为 JavaScript 中的 Karate native 变量

karate - 如何使用 Karate 仅发送 'application/json' 作为内容类型 header ?

karate - 将屏幕截图附加到 json 报告

java - 占位符替换为内联(场景)变量,而不是全局(背景)变量

web-services - 如何从 Karate 将响应值传递给 Java API