就在最近,我體驗了 Cucumber JUnit 5 的場景并行執行,它運行良好,我打算從現在開始使用。以前因為我也使用cucumber-spring,所以我使用 Spring 將單個 TestContext 實體作為注釋的 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實體?這個問題還有其他解決方案嗎?非常感謝。
uj5u.com熱心網友回復:
如果您使用的是最新版本的 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://www.uj5u.com/houduan/517219.html
