Получение нулевого значения для контекста сценария — контейнер пико с огурцом

#testng #cucumber-jvm #cucumber-java #picocontainer

Вопрос:

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

 Feature File
Feature: 01_Permission_Accept

  Scenario: 01_Is AUT installed and click on chapter 1
    Given Check AUT is installed  --> Here I am setting the value to context
    When Click on chapter - Chapter 1: App Fundamentals --> Here the value is retrieved

  Scenario: 02_Click on chapter 2
    When Click on demo chapter - Chapter 2: User Interface --> Here the value is null
 

Файл определения:

 public class MainScreenStepDefs {

TestContext testContext;

public MainScreenStepDefs(TestContext context) {
    this.testContext = context;
}

@Given("Check AUT is installed")
public void checkAUTIsInstalled() {
    boolean abc = testContext.getAppiumDriver().isAppInstalled(testContext.getConfiguration().androidAppPackage());
    SoftAssertions.assertSoftly(softAssertions -> softAssertions.assertThat(abc).as("Application ""  testContext.getConfiguration().androidAppPackage() "" is not installed.").isTrue());
    testContext.getScenarioContext().setContext(ContextEnum.DEMO, "demo"); // Setting value to context
}

@When("Click on chapter - Chapter 1: App Fundamentals")
public void clickOnChapter1() {
    testContext.getPageObjectManager().getMainScreen().selectChapter1();
    String abc  = (String) testContext.getScenarioContext().getContext(ContextEnum.DEMO);
    System.out.println("Data :--------------- t"   abc); //value getting successfully
}

@When("Click on demo chapter - Chapter 2: User Interface")
public void clickOnDemoChapter2() {
    testContext.getPageObjectManager().getMainScreen().selectChapter2();
    String abc  = (String) testContext.getScenarioContext().getContext(ContextEnum.DEMO);
    System.out.println("Data :--------------- t"   abc); // ----null value
}}
 

Файл тестового запуска. Я использую TestNG в качестве бегуна. Внутри @Beforesuite я звоню водителю. здесь используется @BeforeSuite, чтобы избежать закрытия теста после каждого сценария.

Использование Ломбока для получения и установки.

 public class TestRunner extends AbstractTestNGCucumberTests {

    @Getter(AccessLevel.PROTECTED)
    private DriverManager mobileDriverManager;

    public static AppiumDriver<MobileElement> appiumDriver; // making static so this can be accessed directly
    Configuration configuration = ConfigurationManager.getConfiguration();

    @BeforeSuite(alwaysRun = true)
    public void setup() {
        mobileDriverManager = DriverFactory.getMobileDriverManager(DeviceTypeEnum.ANDROID);
        appiumDriver = mobileDriverManager.getMobileDriver(configuration.androidPlatformAndVersion(), configuration.androidDeviceUDID(), configuration.androidSystemPort(), AutomationName.ANDROID_UIAUTOMATOR2);
    }

    @AfterSuite(alwaysRun = true)
    public void tearDown() {
        getMobileDriverManager().quitAppiumDriver();
    }
}
 

TestContext.java
Здесь перед инициализацией PageObjectManager я устанавливаю драйвер приложения. Не делать этого было ошибкой.

 public class TestContext {

    @Getter @Setter
    private AppiumDriver<MobileElement> appiumDriver;

    @Getter
    private ScenarioContext scenarioContext;

    @Getter
    private PageObjectManager pageObjectManager;

    @Getter
    private Configuration configuration = ConfigurationManager.getConfiguration();

    public TestContext() {
        setAppiumDriver(TestRunner.appiumDriver); // This gives error, If I remove this.
        pageObjectManager = new PageObjectManager(getAppiumDriver());
        scenarioContext = new ScenarioContext();
    }
}
 

Пожалуйста, дайте мне знать, правильно ли я выполняю реализацию пикоконтейнера.

Вот пример ссылки на github приложения: https://github.com/dipakkumar1225/DemoCucumberPicoContainerTestng.git

Ответ №1:

Объекты сохраняются по одному сценарию. Вы задаете значение в одном сценарии и пытаетесь прочитать его в другом. Вот почему вы получаете null .

Внедрение зависимостей позволяет распределять состояние между шагами, а не между сценариями.

Если у вас есть что-то, что нужно настроить для каждого сценария, вам нужно разобраться с фоном.