問題: コンストラクション注入、依存注入 / 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 クラスにあります。
複数の定義間で異なるデータ型の複数のデータを共有する問題を解決できる、このフレームワークの間にクラスを追加する方法を誰かが提案できますか