Как я могу использовать переменную во многих PageObjects с JBehave?
Например:
Scenario:
Given the pageOne page
When I get pageOneTitle
And click the first menu item
And I get the pageTwoTitle
Then pageOneTitle is not equals pageTwoTitle
У меня два этапа занятий. Один на каждую страницу.
- PageOneSteps
- PageTwoSteps
Первые три шага сценария находятся в PageOneSteps, а другой в PageTwoSteps. Это означает, что pageTitleOne был сохранен в PageOneSteps. Шаг проверки. Тогда pageOneTitle не равен pageTwoTitle в PageTwoSteps.
Как я могу равняться pageOneTitle и pageTwoTitle в PageTwoSteps, если pageOneTitle в PageOneSteps?
Это очень простой пример. Но я надеюсь, что это иллюстрирует то, что я имею в виду.
Спасибо за вашу поддержку!
3 ответа
Вы можете использовать контекст, в котором вы помещаете объекты / значения, необходимые более чем одному из ваших StepClasses, при выполнении истории. Это может быть реализовано с использованием ThreadLocal. Используя такой контекст, вы можете просто поместить значение, полученное на втором шаге, в контекст и получить его снова на пятом шаге, где это необходимо для сравнения. Примеры того, как использовать ThreadLocal, можно легко найти, например, здесь.
Возможно, самый простой пример выглядит следующим образом (см. Ссылку на странице выше для получения дополнительной информации).
История:
Scenario: store and load a value
When I store the value asdf
Then the value is asdf
Контекст класса:
public class Context {
private String data;
// getData(), setData(), ...
}
Класс MyThreadLocal:
public class MyThreadLocal {
static final class ContextLocal extends ThreadLocal<Context> {
@Override
protected Context initialValue() {
return new Context();
}
}
private static final ThreadLocal<Context> userThreadLocal = new ContextLocal();
public static Context get() {
return userThreadLocal.get();
}
}
И пошаговые занятия:
public class SomeSteps extends Steps {
@When("I store the value $value")
public void storeValue(String value) {
MyThreadLocal.get().setData(value);
}
}
public class SomeOtherSteps extends Steps {
@Then("the value is $value")
public void checkValue(String value) {
assertEquals(value, MyThreadLocal.get().getData());
}
}
В классе Context вы можете использовать более сложные способы хранения данных, например, Map.
Ну, похоже, вам нужен вызов шаблона PageObject. Вместо того, чтобы помещать заголовок атрибута в классы шагов, вы помещаете его в класс AbstractPage.
Затем вы создаете два класса PageOne и PageTwo, выходящие из AbstractPage.
Вы должны создать экземпляры этих объектов Page из любого StepClasses (данной страницы)...
Вы должны сделать свои шаги более явными, чтобы никогда не повторять один и тот же шаг дважды. Вы можете заменить свой сценарий следующим образом:
Scenario:
Given the pageOne page
When I get pageOneTitle as title of pageOne
And click the first menu item of pageOne
And I get the pageTwoTitle of pageTwo
Then pageOneTitle is not equals pageTwoTitle