就在最近,我体验了Cucumber + JUnit 5的并行执行,它工作得很好,我打算从现在开始使用它。之前,由于我还使用了黄瓜- Spring,所以我使用Spring作为带@Component注解的bean来管理单个@Component实例,使用@Before重新设置每个场景。现在有更多的场景并行运行,当然我需要一个线程解决方案。我的解决方案大致如下:
/* Store the Current Scenario in a Thread Local */
private ThreadLocal<Scenario> currentScenario = new ThreadLocal<>();
@Before
public void setup(final Scenario scenario) {
currentScenario.set(scenario);
}/* Get Scenario from a Context Map with ScenarioId as the key */
private Map<String, TestContext> contextMap = new HashMap<>();
public TestContext getContext(final Scenario scenario) {
return contextMap.get(scenario.getId());
}问题是,我不知道场景是以一个线程开始和结束,还是这个建议的解决方案是安全的。还有其他方法可以访问当前场景的Scenario实例吗?这个问题还有其他解决办法吗?非常感谢。
发布于 2022-10-17 21:15:43
如果您使用的是Cucumber的最新版本,那么您的步骤定义类默认为场景范围,不应该使用@Component进行注释。
每个场景都会获得步骤定义类的一个新实例。
因此,这是安全的,即使是并行执行:
private Scenario currentScenario;
@Before
public void setup(final Scenario scenario) {
currentScenario = scenario;
}如果您有其他没有步骤定义的类,这些类在每个场景中都应该有一个唯一的实例,那么可以将@Component与@ScenarioScoped组合起来。
https://github.com/cucumber/cucumber-jvm/tree/main/cucumber-spring#sharing-state-between-steps
https://stackoverflow.com/questions/74098979
复制相似问题