【问题标题】:Cucumber: how can you create a BaseSteps class if you can’t use inheritance with Cucumber?Cucumber:如果不能对 Cucumber 使用继承,如何创建 BaseSteps 类?
【发布时间】:2017-04-26 15:42:33
【问题描述】:

Cucumber:如果不能对 Cucumber 使用继承,如何创建 BaseSteps 类?

Login Steps 继承 CommonSteps 类:

    public class LoginSteps extends CommonSteps {

    WebDriver driver = getDriver();

    @Given("^User navigates to the \"([^\"]*)\" website$")
    public void user_navigates_to_the_website(String url) throws Throwable {
        basePage.loadUrl(url);
    }

    @And("^User entered the \"([^\"]*)\" username$")
    public void user_entered_the_username(String username) throws Throwable {
        loginPage.setUsername(username);
    }






public class CommonSteps  {
    @After
    public void close_browser_window(Scenario scenario) throws Exception {
        if (scenario.isFailed()) {
            scenario.embed(((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES), "image/png");
        }
    }
}

【问题讨论】:

标签: java selenium selenium-webdriver webdriver cucumber


【解决方案1】:

您可以使用继承,但不能使用步骤,原因在 Roberto Pegoraro 的链接中引用。我喜欢将我的步骤组织成不同的步骤定义文件。但这会导致互操作性问题。如果您使用类变量在步骤之间进行通信,那么这些步骤必须在同一个文件中;除非你使用继承。我创建了一个 UiCommon 类来包含共享类变量(例如页面文件实例变量),这些步骤用于在它们之间进行通信。每个步骤定义文件都扩展了 UiCommon。现在,我如何重构各个步骤定义文件之间的步骤定义并不重要。他们仍然可以交流。

对于小型项目,这通常不是问题。但是对于一个有多个测试自动化工程师需要最小化 git 合并冲突的大型项目来说,这很重要。

【讨论】:

  • 非常感谢您的回复,因此您依次创建一个包含所有主要方法的类,然后每个步骤文件将包含“之前”和“之后”标签等,这些标签将依次使用包含在主方法类中的方法。
  • All Before 和 After 标记在每个场景中运行一次。因此,除非您希望它们全部运行,否则每个运行一个或通过标签限制它们。
【解决方案2】:

Java 中的惯用解决方案,也就是 Cucumber-JVM,是当您希望在不同类中实现的步骤之间共享状态时使用依赖注入。

Cucumber 支持许多不同的依赖注入框架。如果你的项目已经使用了一个,很有可能你的依赖框架是支持的。

如果你不使用依赖注入框架,我建议你使用PicoContainer。如果您需要知道如何使用它,我写了一篇博文describing如何在步骤之间共享状态。

【讨论】:

  • 我们也使用 Spring 进行依赖注入。 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
相关资源
最近更新 更多