Cucumber - Java8 - использование @Before с лямбда-выражениями - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть проект Java Selen, настроенный с использованием огурца.Определения шагов находятся в наборе файлов, в которых повторно используется код из файла BaseDefinitions, а именно:

(пример свернут до первого оператора @Given):

public class GoogleDefinitions {

    private BaseDefinitions baseDefinitions;
    private WebDriver driver;

    public GoogleDefinitions (BaseDefinitions baseDefinitions) {
        this.baseDefinitions = baseDefinitions;
        this.driver = baseDefinitions.getDriver();
    }

    @Given("^I visit the Google search page$")
    public void iVisitTheGoogleSearchPage() {
        GoogleSearchHomepage googleSearchHomepage = new GoogleSearchHomepage(driver);
        googleSearchHomepage.visit();
    }
}

Файл BaseDefinitions (короткая версия) выглядит следующим образом:

public class BaseDefinitions {

    private WebDriver driver;


    @Before
    public void setUp(Scenario scenario) throws Exception {
        String path = getClass()
                .getClassLoader()
                .getResource("chromedriver.exe")
                .getPath();
        System.setProperty("webdriver.chrome.driver", path);
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

    @After
    public void teardown() {
        driver.close();
        try {
            driver.quit();
        }
        catch(Exception e) {
            System.out.println("Caught driver error on quit.");
        }
    }

    public WebDriver getDriver() {
        return driver;
    }
}

Это работает нормально - клеевой код и т. д. все настроено правильно.Однако с обновлениями Cucumber теперь генерирует лямбда-выражения, а не формат, используемый ранее.Я не понимаю, как их реализовать.

  • Если я реализую их в конструкторе (как обсуждено здесь ), то оператор @Before файла BaseDefinitions выполняется только после теста, когда я запускаю эту функцию - это бесполезно.
  • Если я помещу их в метод, как показано здесь , когда я запускаю файл объектов, он запускает оператор @Before, но не находит определения шагов.

Ниже приведен пример с лямбдами, реализованными в методе.Когда я запускаю это, это дает мне You can implement missing steps with the snippets below::

public class lambdaTestDefinitions implements En {
    private BaseDefinitions baseDefinitions;
    private WebDriver driver;

    public lambdaTestDefinitions(BaseDefinitions baseDefinitions) {
        this.baseDefinitions = baseDefinitions;
        this.driver = baseDefinitions.getDriver();
    }

    private void testLambdaSteps () {
        Given("I try to navigate to www.google.co.uk", () -> {
            driver.get("http://www.google.co.uk");
        });

        Then("I should be on the Google home page", () -> {
            // Write code here that turns the phrase above into concrete actions
            Assert.assertEquals(driver.getCurrentUrl(), "http://www.google.co.uk");
        });
    }
}

Я явно что-то упускаю - как мне заставить это работать?

РЕДАКТИРОВАТЬ: Вот мой build.gradle.Из того, что я вижу, я не использую версию Cucumber для Java8, которую я не совсем понимаю:

buildscript {
    repositories {
        mavenCentral()
    }
}

plugins {
    id 'java'
    //id "com.github.spacialcircumstances.gradle-cucumber-reporting" version "0.1.2"
}

group 'org.myorg'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
}

project.ext {
    cucumberVersion = '4.0.0'
}

dependencies {
    compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.5.1'
    testCompile group: 'junit', name: 'junit', version: '4.12'
    testCompile 'io.cucumber:cucumber-java:' + cucumberVersion
    testCompile 'io.cucumber:cucumber-junit:' + cucumberVersion
    testCompile group: 'com.browserstack', name: 'browserstack-local-java', version:'1.0.1'
    testCompile group: 'io.cucumber', name: 'cucumber-picocontainer', version: '2.1.0'
    testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3'
    testCompile group: 'org.testng', name: 'testng', version: '6.9.10'
    testCompile 'io.github.prashant-ramcharan:courgette-jvm:3.1.0'
}

test {
    systemProperties System.getProperties()
    ignoreFailures = true

    systemProperty "localBrowser", System.getProperty("localBrowser")
    systemProperty "browserstackLocal", System.getProperty("browserstackLocal")
    systemProperty "browser", System.getProperty("browser")
    testLogging.showStandardStreams = true

    test.outputs.upToDateWhen {false}
}

1 Ответ

0 голосов
/ 01 февраля 2019

Это работает нормально - клеевой код и т. Д. Все настроено правильно.Однако с обновлениями Cucumber теперь генерирует лямбда-выражения, а не формат, который использовался ранее.

Вы добавили cucumber-java8 вместо cucumber-java в свои зависимости.

Если я помещу их в метод, как показано здесь, при запуске файла объектов он запускает оператор @Before, но не находит определения шагов.

Это работает только для некоторых фреймворков, расширяющих Cucumber.Плагин eclipse, однако, поддерживает обе нотации.

Если я реализую их в конструкторе (как описано здесь), то оператор @Before файла BaseDefinitions выполняется только после теста, когда я запускаю эту функцию - это бесполезно.

Вы путаете выполнение шагов огурца с созданием определения шага.Создание определения шага происходит до того, как к нему будут применены какие-либо шаги.this.driver = baseDefinitions.getDriver(); вызывается при создании GoogleDefinitions, поэтому всегда перед методом, который создает драйвер.

Вместо этого вам следует отложить вызов до вызова шага.

public class lambdaTestDefinitions implements En {
    public lambdaTestDefinitions(BaseDefinitions baseDefinitions) {

        Given("I try to navigate to www.google.co.uk", () -> {
            baseDefinitions.getDriver().get("http://www.google.co.uk");
        });

        Then("I should be on the Google home page", () -> {
            // Write code here that turns the phrase above into concrete actions
            assertEquals(baseDefinitions.getDriver().getCurrentUrl(), "http://www.google.co.uk");
        });
    }
}

Вы также можетебыть заинтересованным в исследовании жизненного цикла PicoContainers .Вы можете использовать Стабильный и Одноразовый .Они могут помочь вам настроить то, что нужно настроить, прежде чем Cucumber запустит сценарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...