2

問題: コンストラクション注入、依存注入 / Picocontainer を使用して、状態 (必要な場合) とともに複数のステップ定義間で複数の変数 / データを共有する方法。

背景: 非常に大きなステップ定義があり、それを管理するのが難しくなりました。そこで、この新しいオートメーション ベースを使用して、ステップ定義を複数の小さな定義に分割することにしました。

スタック: Selenium、Java、Cucumber、Junit、Picocontainer。

上記を実現するために、さまざまな Web サイトやスタック オーバーフロー ディスカッションで多くの提案を探しました。依存性注入 (Picocontainer) の使用、コンストラクター インジェクションの使用、Spring などの多くの提案があります。

これらすべての提案とページを調べた後、スタックオーバーフローの1つの場所/1つの回答/1つのページのどこにも回答されていない灰色の領域(上記の問題で言及)が見つかりました。そのため、この例を共有して、より多くの情報を取得します初心者とすべての人を助けます。プロジェクト ファイルの構造:

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 コンストラクターの挿入により、大きな定義を分割することができ、ほとんどのテスト ケースが正常に機能しています。ただし、2 つのステップ定義間でデータを共有するメソッドを使用しようとすると、問題が発生します。

機能ファイル:

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 番目のシナリオでユーザーが選択した製品名と ID にアクセスし、3 番目のシナリオで検証します。2 番目のシナリオは ProductStepDefinition クラスの下にあり、同じ機能ファイルの 3 番目のシナリオは PaymentStepDefintion クラスにあります。

複数の定義間で異なるデータ型の複数のデータを共有する問題を解決できる、このフレームワークの間にクラスを追加する方法を誰かが提案できますか

4

1 に答える 1