Сценарий Java с огуречным порядком
Я работаю над проектом автоматизации.
Мой первый сценарий - это функция входа в систему. Я работаю над SaaS, и мне нужно войти в систему раньше.
Поэтому я думал о первом сценарии login.feature и втором сценарии для заполнения формы.
У меня есть два файла:
login.feature
fill_form.feature
Я запускаю свои тесты с
mvn clean test -Dcucumber.options="--tags @login,@form"
Таким образом, он открывает два окна, но выполнение не работает должным образом: он запускает два сценария одновременно.
Чтобы это работало, мне нужно создать только один файл функций, но это не то, что мне нужно для моей архитектуры.
Предложения приветствуются!
Спасибо
4 ответа
Ваш подход правильный (вы не хотите дублирования кода), но вместо повторного использования файла функций вам следует повторно использовать шаг. У вас есть два варианта здесь:
- Фон
Вы можете указать, какой шаг должен быть вызван перед всеми сценариями в файле объектов. Например:
Background:
given I logged in
Scenario: Fill a form
then I filled a form
Scenario: Some other scenario
then "here is some work for other scenario"
- Вызов шагов из определений шагов
Создайте определение шага, которое вызывает другие. В вашем случае это будет означать создание шага заполнения формы, который войдет в систему в начале.
В огурцах все сценарии выполняются в алфавитном порядке (так что @form перед @login). Вы можете переименовать свои сценарии в @001-login, @002form, @003...
Если вы используете Maven, вы можете добавить копию / заменить на org.apache.maven.plugins:maven-antrun-plugin
а также com.google.code.maven-replacer-plugin:replacer
Образец:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>copy-order-scenarios</id>
<phase>compile</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target name="copy">
<copy
file="src/test/resources/steps/scenarios/login.feature"
tofile="src/test/resources/steps/run/001-login.feature" />
<copy
file="src/test/resources/steps/scenarios/form.feature"
tofile="src/test/resources/steps/run/002-form.feature" />
</target>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>replacer</artifactId>
<version>1.5.3</version>
<executions>
<execution>
<id>replace order</id>
<phase>compile</phase>
<goals>
<goal>replace</goal>
</goals>
<configuration>
<basedir>${basedir}</basedir>
<includes>
<include>src/test/resources/steps/run/001-*.feature</include>
</includes>
<token>login</token>
<value>001-login</value>
</configuration>
</execution>
</executions>
</plugin>
Как я полагаю, вы должны запустить тест, в котором вы пытаетесь войти, а затем заполните форму. Для этого вам не нужно создавать два разных файла
Вы можете создать свой файл функций, как это
Сценарий: я вхожу как пользователь.
Дано мне Войти с действительными учетными данными.
Когда я должен перейти к форме.
Тогда я должен заполнить все детали.
Все эти шаги будут связаны с определениями шагов.
Файл функции
Особенность: Я Войти и заполнить всю информацию
Сценарий: я вхожу в систему как пользователь, чтобы заполнить действительную информацию в форме
Дано Запустить приложение со страницы входа
Когда я Войти с действительными учетными данными пользователя
Класс Step-Definition (который включает в себя только все ваши шаги, из которых вы вызываете методы из другого класса для выполнения задач)
public class Some_functionality extend DriverInitializer {
WebDriver webDriver;
@Given("^Start application from a Login page$")
public void start_application_from_signin_page() throws Throwable {
webDriver = driverInitilizer();
}
@When("^I Login with valid user credentials")
public void login() throws Throwable {
LoginSteps loginsteps = new LoginSteps();
loginsteps.signinAsUser(webDriver);
}
}
Теперь вам нужно создать еще один класс, чтобы определить ваши шаги шаги
public class Loginsteps{
public void signinAsUser(Webdriver webDriver){
//your code here
}
}
Вы можете вызывать метод signinAsUser везде, где хотите использовать
LoginSteps loginsteps = new LoginSteps();
loginsteps.signinAsUser(webDriver);
и вы можете инициировать драйвер в отдельном классе
public class DriverInitializer{
public WebDriver driverInitilizer(){
//your code to initialize driver
SetProperty...
return webdriver;
}