Огурец, инъекция Java Picocontainer / Constructor: TestContext & ScenarioContext), как разделить несколько данных между определениями нескольких шагов - PullRequest
2 голосов
/ 18 октября 2019

Проблема: Как разделить несколько переменных / данных между определениями нескольких шагов вместе с состоянием (если требуется), используя инъекцию конструкции, зависимую инъекцию / Picocontainer.

Справочная информация: у нас было очень большое определение шага, и оно былостановится трудно управлять этим. Итак, мы решили разделить определение шага на несколько небольших определений, используя эту новую базу автоматизации.

Стек: Selenium, Java, Cucumber, Junit, Picocontainer.

Чтобы достичь вышеизложенного, мы искали много предложений на различных веб-сайтах и ​​в обсуждении stackoverflow. Существует много предложений, таких как использование Dependency. Инъекция (Picocontainer), использование Constructor Injection, spring и т. Д.

После прохождения всех этих предложений и страницы мы обнаружили некоторые серые области (упомянутые в задаче выше), на которые нигде не было ответа в стеке потока в одном месте/ один ответ / одна страница, поэтому я делюсь этим примером, чтобы получить больше информации, которая поможет новичкам и всем. Структура файлов проекта:

src
|->features
  |----- login.feature
  |----- product.feature
  |----- payment.feature
|->java
  |-->pagefactory
  |    |----- LoginPage.class
  |    |----- ProductPage.class
  |    |----- PaymentPage.class
  |-->picoHelper
  |    |-----TestContext.class   
  |-->stepDefinition
  |    |-----LoginStepDef.class
  |    |-----SearchStepDef.class
  |    |-----ProductStepDef.class
  |    |-----PaymentStepDef.class
  |-->helpers
  |    |-->wait
  |    |-----waitHelper.class
  |    |-->util
  |    |-----DriverFactoryManager.class
  |    |-----PageFactoryManager.class 

С помощью этой вышеописанной инъекции конструктора testcontext в определение шага мы можем разделить наши большие определения, и большинство тестовых примеров работают нормально. Однако проблема возникает, когда мы пытаемся использовать метод, который имеет некоторые общие данные между двумя определениями шагов.

Файл функции:

Feature: Verify Product Names and ID are being transferred to Payment Page
  This feature will be used to validate Data


  Scenario: Successful Login with Valid Credentials
    Given User navigate to homepage of portal
    When user enter valid credentials
    Then user should be redirected to homepage


  Scenario: To select the product
    Given User is on product page
    When User select product
    And filterit via productsearch
    Then user should be able to search this product

 Scenario: Payment 
    Given User has selected product
    When User click add to cart
    Then System should display all related info for user to verify

TestContext выглядит следующим образом:

public class TestContext {

    private DriverFactoryManager driverFactoryManager;
    private PageObjectManager pageObjectManager;
    public ScenarioContext scenarioContext;

    public TestContext() {
        driverFactoryManager = new DriverFactoryManager();
        pageObjectManager = new PageObjectManager(driverFactoryManager.getDriver());
    }

    public DriverFactoryManager getDriverFactoryManager() {
        return driverFactoryManager;
    }

    public PageObjectManager getPageObjectManager() {

        return pageObjectManager;
    }

}

Определение шага: LoginStepDef

public class LoginStepDef {
    LoginPage lp;
    TestContext testContext;


    private Logger log = LoggerHelper.getLogger(LoginStepDef.class);


    public LoginStepDef(TestContext testContext) throws IOException {
        lp = testContext.getPageObjectManager().getLoginPage();


    }
    //
    methods to login to portal


Определение шага: ProductStepDefs

public class ProductStepDef {
   private Logger log = LoggerHelper.getLogger(ProductStepDef.class);
    TestContext testContext;
    private LoginPage lp;
    private ProductPage objPM;

    String[] prodCodeName = new String[2];
    String[] productDetails;



    public ProductStepDef(TestContext testContext) {
        this.testContext = testContext;
        lp = testContext.getPageObjectManager().getLoginPage();
        objPM = testContext.getPageObjectManager().getProductPage();

   @Then("^user should be able to search this product$")
    public void advancedSearchProduct {

        objPM.advancedSearchProduct(searchKeyword);
        prodCodeName = objPM.productDataProdCodeName();
        log.info("product is: " + prodCodeName[0] + ". Its name is " + prodCodeName[1]); //expected 0 to show id and 1 to show name of product
        productDetails = prodCodeName;
        log.info("productDetails  are : " + productDetails);


    }
    }

Определение шага: PaymentStepDefs

public class PaymentStepDef {

    Logger log = LoggerHelper.getLogger(PaymentStepDef.class);
    LoginPage lp;
    Product objPM;
    PaymentPage objPay;

    String[] prodCodeName = new String[2];
    String[] productDetails;


    public PaymentStepDef(TestContext testContext) {
        this.testContext = testContext;
        lp = testContext.getPageObjectManager().getLoginPage();
        objPM = testContext.getPageObjectManager().getProductPage();
        objPay = testContext.getPageObjectManager().getPaymentPage();



    @Then("^System should display all related info for user to verify$")
    public void verifyExportResult()  {

            exportInfo = objPay.ExportResult(filter1, productDetails, numberOfItems );
            THis Export results, take this productDetails to perform some action to compare with various version and then give perform some validation.
    }

мы хотим получить доступ к названию продукта иИдентификатор, выбранный пользователем во втором сценарии, и проверка в третьем сценарии. 2-й сценарий относится к классу ProductStepDefinition, а 3-й сценарий того же файла объектов находится в классе PaymentStepDefintion.

Может кто-нибудь предложить способ добавить класс между этими структурами, который может решить проблему совместного использования нескольких данных разных типов данных между несколькимиопределения

1 Ответ

1 голос
/ 18 октября 2019

Огурец не должен был работать таким образом. Результаты одного сценария не должны использоваться в качестве основы для другого сценария. Вместо этого вам нужен шаг Given, который имитирует то, что сделал другой сценарий.

Feature: Verify Product Names and ID are being transferred to Payment Page
  This feature will be used to validate Data


  Scenario: Successful Login with Valid Credentials
    Given User navigate to homepage of portal
    When user enter valid credentials
    Then user should be redirected to homepage


  Scenario: To select the product
    Given User is on product page
    When User select product
    And filterit via productsearch
    Then user should be able to search this product

 Scenario: Payment
    # Put the product in the database
    Given a product named "Jump Rope" exists
    # Get the product by name, go to product page and add to cart
    When the user adds the "Jump Rope" product to their shopping cart
    # Assert
    Then System should display all related info for user to verify

Сценарий № 3 должен поместить продукт в систему, указав имя в двойных кавычках. Шаг When приведет пользователя на страницу сведений о продукте и нажмите кнопку «Добавить в корзину». После этого ваш существующий шаг Then может сделать утверждения.

...