空手道 - 请求多线程访问 - 问题

Karate - Multi threaded access requested - issue

我有超过 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 个很关键。

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

这是一个已知问题,应该在 1.1.0.RC2 中修复

详情在这里:https://github.com/intuit/karate/issues/1558

能确认一下就好了

我在空手道实施中遇到了这个问题@peter-thomas。由于我们知道 graalVM js 引擎不支持 karate-config.js

的多线程,因此我刚刚找到了解决此问题的简单方法

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

空手道内的代码如下-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;
    
    }

使用上面的代码,我尝试了我的 100 多个功能文件 运行 20 个带有空手道 1.2.0.RC1 的并行线程,它运行得非常好。

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

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

谢谢, 索拉布