同时配置功能和场景级别的并行性 - cucumber 与 Junit5

问题描述 投票:0回答:1

我检查了一些类似的问题,但没有找到适合我的答案。最相似的问题是“这个问题”,但它是针对 TestNG 的。也许有人遇到像我这样的问题并已经解决了? 我用黄瓜和junit。

我有几个功能文件。每个功能文件旨在测试一个应用程序实例:A.feature、B.feature、C.feature。每个特征文件包含一个场景模板(大纲)和N个示例(通常超过10个)。 应用程序实例彼此独立。每个应用程序实例可以在 M 个线程(通常是 2 个)中处理输入数据。因此,在超过 M (2) 个线程中运行特定应用程序实例的场景是没有意义的,因为这会导致不稳定的测试和不稳定的执行时间。 在同一时间,在一个线程中运行一个实例(execution-mode.feature=same_thread)的场景可能会花费很多时间。

我想实现什么:

并行运行功能文件。
  • 并行运行特定功能文件中的场景,但仅限于 2 个同时运行的场景。
  • 总线程限制应等于 CPU 数量或固定池大小,假设为 6 (parallel.config.fixed.max-pool-size=6)
  • 示例:

同时执行:

A.feature - scenario 1 - scenario 2 B.feature - scenario 1 - scenario 2 C.feature - scenario 1 - scenario 2

排队等候:

A.feature - scenario 3 - scenario 4 ... - scenario 10 B.feature - scenario 3 - scenario 4 ... - scenario 10 C.feature - scenario 3 - scenario 4 ... - scenario 10

图形可视化以便更好地理解:

我认为可以使用 CustomStrategy 来实现:

https://github.com/cucumber/cucumber-jvm/tree/main/cucumber-junit-platform-engine#parallel-execution

控制所需的并行度和最大并行度等属性 并行性,Cucumber 支持 JUnit 5s 并行执行配置策略。黄瓜提供两种 实现:动态和固定,可以通过设置 黄瓜.execution.parallel.config.strategy。您还可以实施 自定义策略。

但这可能很棘手,尤其是我现在不明白这些属性是在什么时间点设置的。它们是否可以动态更改(换句话说,基于功能文件配置,而不仅仅是 pom.xml)。

我的想法是尝试在场景级别使用标签,例如 @feature=A、@feature=B 等来限制场景池的并行性。但我才刚刚开始我的旅程,所以如果可能的话需要建议。

更新

正如已接受的答案中提到的,Junit5 的当前实现不允许我们这样做。提出功能请求:https://github.com/junit-team/junit5/issues/3524

junit5 cucumber-java cucumber-junit
1个回答
1
投票

但是您可以在自己的代码中使用类似

https://commons.apache.org/proper/commons-pool/

来实现此功能 然后,对于您要测试的每个系统,池中应包含 2 个代币。

@Resource1 Feature: Example 1 Scenario Outline: Examples @Resource2 Feature: Example 2 Scenario Outline: Examples

然后在开始场景之前,您可以阻止并从池中获取资源。

static ObjectPool<?> pool = ... @Before public void before(Scenario scenario) { var tags = scenario.getTags(); // Will contain either @Resource1 or @Resource2. // block and acquire a resource from the pool } @After public void after(Scenario scenario) { var tags = scenario.getTags(); // return a resource to the the pool }

您将有相当多的线程等待从池中获取资源,并且肯定有比 CPU 更多的线程,这不太好,但我确实认为这是可以管理的。

注意:我自己没有使用过这个。

© www.soinside.com 2019 - 2024. All rights reserved.