Проблема: Как разделить несколько переменных / данных между определениями нескольких шагов вместе с состоянием (если требуется), используя инъекцию конструкции, зависимую инъекцию / 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.
Может кто-нибудь предложить способ добавить класс между этими структурами, который может решить проблему совместного использования нескольких данных разных типов данных между несколькимиопределения