如何使用java从cucumber中的场景大纲中获取场景名称

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

假设我有一个像 -

这样的测试用例
*Scenario: Facebook login test
GIVEN I am a Facebook user
WHEN I enter my user name & password
THEN login should be successful*

如何从“我是 Facebook 用户”或“我输入用户名和密码”或“登录应该成功”对应的步骤定义方法中获取场景名称?

步骤定义方法是-

@Given("^I am a Facebook user$")
public void method1() {
 //some coding
 //I want to get the scenario name here
}

@When("^I enter my user name & password$")
public void method2() {
 //some coding
 //I want to get the scenario name here
}

@Then("^login should be successful$")
public void method3() {
 //some coding
 //I want to get the scenario name here
}
java cucumber cucumber-jvm cucumber-junit cucumber-java
4个回答
4
投票

不@Bappa,这是可能的,尽管你的stepdefinition类是单例的并且你的测试是并行的,但是通过使用用于存储的线程安全静态哈希映射变量来增强它,可以看到它受到以下方法的攻击:

public class StepDefinitions{
 private static HashMap<Integer,String> scenarios;

public StepDefinitions(){ //or even inside of your singleton's getInstance();
 if(scenarios == null)
   scenarios = new HashMap<Integer,String();
}

@Before
public void beforeHook(Scenario scenario) {
    addScenario(scenario.getName());
}

@When("your step definition")
public void stepDefinition1(){
   String scenario = getScenario(); //problem-o-solved here...
}


private void addScenario(String scenario){
     Thread currentThread = Thread.currentThread();
     int threadID = currentThread.hashCode();
     scenarios.put(threadID,scenario);
}

private synchronized String getScenario(){
     Thread currentThread = Thread.currentThread();
     int threadID = currentThread.hashCode();
     return scenarios.get(threadID);
}

4
投票

您可以使用

@Before
钩子来获取当前正在执行的
Scenario
对象。

@Before
public void beforeHook(Scenario scenario) {
     this.sce = scenario
     System......(scenario.getName())
     System......(scenario.getId())
}

您可以访问步骤定义中存储的场景对象。


0
投票

在步骤定义中,您可以使用

CucumberHelper.scenario.getName()

基于此 API,您可以使用

getID
getSourceTagNames
getStatus
getClass
方法。


0
投票

很晚才谈到这个问题,但 Bhuvanesh Mani 的答案可以通过使用 ThreadLocal 字段来简化。以下代码消除了所有线程操作和辅助方法,同时仍然保持线程安全

public class StepDefinitions {
    private static ThreadLocal<String> localName;

    @Before
    public void beforeHook(Scenario scenario) {
        localName.set(scenario.getName());
    }

    @When("your step definition")
    public void stepDefinition1(){
        String scenario = localName.get();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.