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

Cucumber: how can you create a BaseSteps class if you can’t use inheritance with Cucumber?

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

登录步骤继承CommonSteps class:

    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");
        }
    }
}

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

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

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

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

如果你不使用依赖注入框架,我建议你使用PicoContainer. If you need to know how to use it, I wrote a blog post describing如何在步骤之间共享状态。