我在 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/