我的功能文件包含一个功能,该功能需要每个步骤定义文件都反复使用。如何管理代码
我的功能是:- “用户在主页上”。
上面的功能/场景包含需要再次重复使用的代码。在我的代码库中,我为每个功能文件编写了单独的步骤定义。
我的第一步定义文件:-
@Given ("^user is on HomePage$")
public void user_homePage()
{
configFileReader =new ConfigFileReader();
System.setProperty("webdriver.chrome.driver","D:\\chromedriver.exe");
driver=new ChromeDriver();
driver.get("https://parabank.parasoft.com/parabank/index.htm");
driver.manage().window().maximize();
}
现在,另一个步骤定义文件中需要使用相同的功能。即 在下面
在用户单击“注册”链接之前,它应验证用户是否在主页上。第一步定义文件中定义了“用户在主页上”的描述。
现在如何在此处管理代码:-
下面的“我的第二步”定义文件:-
导入StepFiles.ParaBank_TC_01_Step; [我什至已经导入了第一步定义文件,因此可以执行功能“用户在主页上”。 ]
public class ParaBank_TC_02_Step {
public WebDriver driver;
ConfigFileReader configFileReader;
@When ("^user clicks on register link$")
public void click_register() throws InterruptedException
{
Thread.sleep(3000);
WebElement register_link= driver.findElement(By.xpath("//a[contains(text(),'Register')]"));
register_link.click();
}
实际结果:- 1.当我将两个功能文件的所有步骤定义都写在一个文件中时,它执行得很好,因为功能“用户在主页上”是在同一文件中定义的。
请帮助我理解此问题的根本原因并提供最佳解决方案。
答案 0 :(得分:2)
为了在步骤之间共享状态,可以使用依赖项注入(DI)。 Cucumber提供了对多个DI框架的支持。我们建议您使用您的应用程序已经使用的/您熟悉的(在我的情况下,就是Spring)。否则,我们建议将PicoContainer作为最轻巧的选项。
您可以在Cucumber docs和GitHub上的相关代码中找到有关使用DI的更多信息。
有关使用 PicoContainer 的更多信息,请参阅此blogpost。
要使用 Spring ,请查看我的blogpost。
要使用 Guice ,请查看此blogpost。
边注: 与功能耦合的步骤定义(在一个单独的文件中定义每个功能的步骤定义,以使它们无法在各个功能中重复使用)被认为是反模式,因为“这可能会导致步骤定义激增,代码重复,维护成本高。” (来自Cucumber docs)。
解决方案是使步骤定义脱钩: ” *按域概念组织您的步骤。
为此,您将需要使用DI。
答案 1 :(得分:0)
如果您有兴趣实施 PicoContainer ,请按照以下步骤进行深入了解:
步骤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>