【问题标题】:How to manage the step definition code that needs to be reused again & again如何管理需要一次又一次重用的步骤定义代码
【发布时间】:2019-07-12 06:28:39
【问题描述】:

我的功能文件包含一个功能,需要每个步骤定义文件一次又一次地重复使用。如何管理代码

我的特点是:- “用户在主页上”。

上述功能/场景包含需要一次又一次重用的代码。在我的代码库中,对于每个功能文件,我都编写了单独的步骤定义。

我的第一步定义文件:-

@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();
    }

现在需要在另一个步骤定义文件中使用相同的功能。 IE 在下面

在用户点击“注册”链接之前,它应该验证用户是否在主页上。 “用户在主页上”的描述在第一步定义文件中定义。

现在如何在这里管理代码:-

下面是我的第二步定义文件:-

导入 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. 当我在一个文件中编写 2 个功能文件的所有步骤定义时,它执行得非常好,因为功能“用户在主页上”是在同一个文件中定义的。

  1. 当我在另一个 java 文件中为功能 2 编写单独的步骤定义时。它向我显示“空指针异常”错误,因为在功能“用户在主页上”> 驱动程序在 1 步 def 文件中初始化。它没有为第二步定义文件执行。

请帮助我了解此问题的根本原因并提供最佳解决方案。

【问题讨论】:

  • 我什至在步骤“用户在主页”上使用了“@Before”注释,以便可以在每个方法之前执行。
  • 您应该在步骤之外初始化驱动程序,然后给定的步骤就是 driver.get(uri)

标签: selenium cucumber bdd


【解决方案1】:

为了在步骤之间共享状态,您可以使用依赖注入 (DI)。 Cucumber 提供对多个 DI 框架的支持。我们建议您使用您的应用程序已经使用/您熟悉的一种(在我的情况下,即 Spring)。否则,我们推荐 PicoContainer 作为最轻量级的选择。

您可以在Cucumber docs 和 GitHub 上的相关代码中找到更多关于使用 DI 的信息。

有关使用 PicoContainer 的更多信息,请参阅blogpost

要使用Spring,请查看我的blogpost

要使用 Guice,请查看blogpost

旁注: 特征耦合的步骤定义(在单独的文件中为每个特征定义步骤定义,以便它们不能跨特征重用)被认为是一种反模式,因为“这可能导致步骤定义的爆炸式增长,代码重复,维护成本高。” (来自Cucumber docs)。

解决方案是将步骤定义解耦: " * 按领域概念组织您的步骤。

  • 为您的步骤和步骤定义文件使用与域相关的名称(而不是与功能或场景相关的名称)。” (来自Cucumber docs)。

为此,您需要使用 DI。

【讨论】:

    【解决方案2】:

    如果您有兴趣实现PicoContainer,请按照以下步骤更好地理解

    第 1 步。OrderSelectionStepDef 和 OrderDetailsS​​tepDef 如下所示(请根据您的实施更改名称)

    /**
     * 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>
    

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2016-03-14
      • 2017-04-13
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多