java 中黄瓜步骤之间共享状态的实现
Implementation of shared state among cucumber steps in java
我有两页对象,分别称为 OrderSelection
和 OrderDetails
。另外,我还有SharedState
class和OrderSelectionStepDef
和OrderDetailsStepDef
。我在 SharedState
中为 OrderSelection
和 OrderDetails
声明了两个变量。但是,它们没有在 SharedState
的构造函数中初始化。
在 OrderSelectionStepDef
和 OrderDetailsStepDef
classes 中,我声明了它们的构造函数并传递了 SharedState
对象。
public OrderSelectionStepDef(SharedState sharedState) {
this.sharedState = sharedState;
}
public OrderDetailsStepDef(SharedState sharedState) {
this.sharedState = sharedState;
}
当我在 OrderDetailsStepDef
或 OrderSelectionStepDef
中调用 sharedState.orderDetails
时抛出了 NullPointerException
。
然后,我在 SharedState
构造函数中初始化 OrderSelection
和 OrderDetails
class 对象。然后问题就解决了。但是这个实现是否适合黄瓜 pico 容器概念?
第 1 步。OrderSelectionStepDef 和 OrderDetailsStepDef 如下所示(请根据您的实施更改名称)
/**
* Step Definition implementation class for Cucumber Steps defined in Feature file
*/
public class HomePageSteps extends BaseSteps {
TestContext testContext;
public HomePageSteps(TestContext context) {
testContext = context;
}
@When("^User is on Brand Home Page (.+)$")
public void user_is_on_Brand_Home_Page(String siteName) throws InterruptedException {
homePage = new HomePage().launchBrandSite(siteName);
testContext.scenarioContext.setContext(Context.HOMEPAGE, homePage);
}
@Then("^Clicking on Sign In link shall take user to Sign In Page$")
public void clicking_on_Sign_In_link_shall_take_user_to_Sign_In_Page() {
homePage = (HomePage) testContext.scenarioContext.getContext(Context.HOMEPAGE);
signInPage = homePage.ecommSignInPageNavigation();
testContext.scenarioContext.setContext(Context.SIGNINPAGE, signInPage);
}
供大家参考
public class BaseSteps {
protected HomePage homePage;
protected PLPPage plpPage;
protected PDPPage pdpPage;
protected ShoppingBagPage shoppingBagPage;
protected ShippingPage shippingPage;
More implementation goes here.....
}
步骤2.请在你的框架下添加下面2个类 -
首先,Java文件名-ScenarioContext.java
public class ScenarioContext {
private Map<String, Object> scenarioContext;
public ScenarioContext(){
scenarioContext = new HashMap<String, Object>();
}
public void setContext(Context key, Object value) {
scenarioContext.put(key.toString(), value);
}
public Object getContext(Context key){
return scenarioContext.get(key.toString());
}
public Boolean isContains(Context key){
return scenarioContext.containsKey(key.toString());
}
}
二、Java文件名-TestContext.java
public class TestContext {
public ScenarioContext scenarioContext;
public TestContext(){
scenarioContext = new ScenarioContext();
}
public ScenarioContext getScenarioContext() {
return scenarioContext;
}
}
步骤 3. POM 依赖性 - picocontainer 应根据您的黄瓜版本
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-picocontainer</artifactId>
<version>${cucumber.version}</version>
</dependency>
希望对您有所帮助。
我有两页对象,分别称为 OrderSelection
和 OrderDetails
。另外,我还有SharedState
class和OrderSelectionStepDef
和OrderDetailsStepDef
。我在 SharedState
中为 OrderSelection
和 OrderDetails
声明了两个变量。但是,它们没有在 SharedState
的构造函数中初始化。
在 OrderSelectionStepDef
和 OrderDetailsStepDef
classes 中,我声明了它们的构造函数并传递了 SharedState
对象。
public OrderSelectionStepDef(SharedState sharedState) {
this.sharedState = sharedState;
}
public OrderDetailsStepDef(SharedState sharedState) {
this.sharedState = sharedState;
}
当我在 OrderDetailsStepDef
或 OrderSelectionStepDef
中调用 sharedState.orderDetails
时抛出了 NullPointerException
。
然后,我在 SharedState
构造函数中初始化 OrderSelection
和 OrderDetails
class 对象。然后问题就解决了。但是这个实现是否适合黄瓜 pico 容器概念?
第 1 步。OrderSelectionStepDef 和 OrderDetailsStepDef 如下所示(请根据您的实施更改名称)
/**
* Step Definition implementation class for Cucumber Steps defined in Feature file
*/
public class HomePageSteps extends BaseSteps {
TestContext testContext;
public HomePageSteps(TestContext context) {
testContext = context;
}
@When("^User is on Brand Home Page (.+)$")
public void user_is_on_Brand_Home_Page(String siteName) throws InterruptedException {
homePage = new HomePage().launchBrandSite(siteName);
testContext.scenarioContext.setContext(Context.HOMEPAGE, homePage);
}
@Then("^Clicking on Sign In link shall take user to Sign In Page$")
public void clicking_on_Sign_In_link_shall_take_user_to_Sign_In_Page() {
homePage = (HomePage) testContext.scenarioContext.getContext(Context.HOMEPAGE);
signInPage = homePage.ecommSignInPageNavigation();
testContext.scenarioContext.setContext(Context.SIGNINPAGE, signInPage);
}
供大家参考
public class BaseSteps {
protected HomePage homePage;
protected PLPPage plpPage;
protected PDPPage pdpPage;
protected ShoppingBagPage shoppingBagPage;
protected ShippingPage shippingPage;
More implementation goes here.....
}
步骤2.请在你的框架下添加下面2个类 -
首先,Java文件名-ScenarioContext.java
public class ScenarioContext {
private Map<String, Object> scenarioContext;
public ScenarioContext(){
scenarioContext = new HashMap<String, Object>();
}
public void setContext(Context key, Object value) {
scenarioContext.put(key.toString(), value);
}
public Object getContext(Context key){
return scenarioContext.get(key.toString());
}
public Boolean isContains(Context key){
return scenarioContext.containsKey(key.toString());
}
}
二、Java文件名-TestContext.java
public class TestContext {
public ScenarioContext scenarioContext;
public TestContext(){
scenarioContext = new ScenarioContext();
}
public ScenarioContext getScenarioContext() {
return scenarioContext;
}
}
步骤 3. POM 依赖性 - picocontainer 应根据您的黄瓜版本
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-picocontainer</artifactId>
<version>${cucumber.version}</version>
</dependency>
希望对您有所帮助。