我检查了一些类似的问题,但没有找到适合我的答案。最相似的问题是“这个问题”,但它是针对 TestNG 的。也许有人遇到像我这样的问题并已经解决了? 我用黄瓜和junit。
我有几个功能文件。每个功能文件旨在测试一个应用程序实例:A.feature、B.feature、C.feature。每个特征文件包含一个场景模板(大纲)和N个示例(通常超过10个)。 应用程序实例彼此独立。每个应用程序实例可以在 M 个线程(通常是 2 个)中处理输入数据。因此,在超过 M (2) 个线程中运行特定应用程序实例的场景是没有意义的,因为这会导致不稳定的测试和不稳定的执行时间。 在同一时间,在一个线程中运行一个实例(execution-mode.feature=same_thread)的场景可能会花费很多时间。
我想实现什么:
并行运行功能文件。
同时执行:
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
图形可视化以便更好地理解: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
但是您可以在自己的代码中使用类似
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 更多的线程,这不太好,但我确实认为这是可以管理的。
注意:我自己没有使用过这个。