www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home
Занимательная история, выдающиеся люди, малоизвестные факты, находки, открытия, фальсификации. Присоединяйся!

Совместное использование состояния между шагами в Cucumber Java - с помощью Picocontainer

Дата публикации Oct 3, 2019

Эта статья является расширением моей предыдущей статьи на тему REST:

REST-гарантируется с помощью Cucumber Java: BDD для автоматизации веб-сервисов

Behavior Driven Development (BDD) стала популярным подходом в передаче требований между заинтересованными сторонами…

medium.com

Наивным решением в Java для совместного использования состояния между несколькими классами может быть использование статических полей. Это будет работать. Но, к сожалению, становится очень просто передавать информацию из одного сценария в другой, так как статические поля не очищаются во время работы JVM.

Как вы разделяете состояние в Java тогда? Лучшее решение в Java - использовать внедрение зависимостей (DI). То есть вводить общий объект в каждом классе с помощью шагов. Объект, который воссоздается каждый раз, когда выполняется новый сценарий.

Для этого есть несколько вариантов: PicoContainer, Spring, OpenEJB и т. Д. Если вы еще не используете DI, я рекомендую PicoContainer.

В Dependency Injection мы будем внедрять общий объект в каждый класс. Так. мы создаем общий класс объектов и используем его по всему. Этот общий класс называется Сценарий контекста в огурце.

Первое, что вам нужно сделать, это добавить зависимость в ваш pom-файл:

<!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-picocontainer -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-picocontainer</artifactId>
<version>4.7.2</version>
</dependency>

Затем создайте новый класс, который содержит общие данные. Например:

package stepdefs;import io.restassured.response.Response;
import io.restassured.response.ValidatableResponse;
import io.restassured.specification.RequestSpecification;public class StepData {

protected Response response;
protected ValidatableResponse json;
protected RequestSpecification request;}

Затем в каждом файле определения шага, для которого вы хотите использовать эти общие данные, вы можете добавить конструктор, который принимает StepData в качестве аргумента. Здесь происходит инъекция. Например:

public class UserStepDefinitions {

private StepData stepData;public UserStepDefinitions(StepData stepData) {
this.stepData = stepData;
}

Затем вы можете использовать stepData для доступа ко всем общим полям, необходимым для ваших классов определения шагов. Например, я разделил определение шага на классы UserStepDefinitions и GenericStepDefinitions:

package stepdefs;import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.equalTo;import java.util.List;
import java.util.Map;import org.apache.commons.lang3.StringUtils;import io.cucumber.datatable.DataTable;
import io.cucumber.java.en.And;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;public class UserStepDefinitions {

private StepData stepData;public UserStepDefinitions(StepData stepData) {
this.stepData = stepData;
}@Given("I set Headers and Parameters for request")
public void set_hearders_parameters(DataTable dt)
{
List<Map<String, String>> list = dt.asMaps(String.class, String.class);
for(int i=0; i<list.size(); i++) {
if(StringUtils.isNumeric(list.get(i).get("VALUE"))){
stepData.request=given().param(list.get(i).get("KEY"), Integer.parseInt(list.get(i).get("VALUE")));
}
else{
given().param(list.get(i).get("KEY"), list.get(i).get("VALUE"));
}
}
}

@Given("User hit the webservice (.*)")
public void user_hit_the_webservice(String WebServiceURL){
stepData.response = stepData.request.when().get(WebServiceURL);
}

@Then("I convert response in String Format")
public String get_response_string(String WebServiceURL)
{
String ResponseString = stepData.response.toString();
return ResponseString;
}
}

в другом файле:

package stepdefs;import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.equalTo;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import io.cucumber.java.en.And;
import io.cucumber.java.en.Then;public class GenericStepDefinitions {

private StepData stepData;public GenericStepDefinitions(StepData stepData) {
this.stepData = stepData;
}

@Then("The status code is (\\d+)")
public void verify_status_code(int statusCode){
stepData.json = stepData.response.then().statusCode(statusCode);
}@Then("I print all the logs on Console")
public void print_allLogs()
{
stepData.response.then().log().all();
}

@And("Response includes the following$") //Verifying single content using equalTo method of hamcrest library
public void response_equals(Map<String,String> responseFields){
for (Map.Entry<String, String> field : responseFields.entrySet()) {
if(StringUtils.isNumeric(field.getValue())){
stepData.json.body(field.getKey(), equalTo(Integer.parseInt(field.getValue())));
}
else{
stepData.json.body(field.getKey(), equalTo(field.getValue()));
}
}
}@And("Response includes the following in any order")
public void response_contains_in_any_order(Map<String,String> responseFields){
for (Map.Entry<String, String> field : responseFields.entrySet()) {
if(StringUtils.isNumeric(field.getValue())){
stepData.json.body(field.getKey(), containsInAnyOrder(Integer.parseInt(field.getValue())));
}
else{
stepData.json.body(field.getKey(), containsInAnyOrder(field.getValue()));
//json.body(field.getKey(), hasItems(field.getValue())); //This can also be used
}
}
}
}

Это позволит вам поделиться состоянием полей в StepData со всеми вашими файлами определения шагов.

Перейдите к корневой папке проекта в командной строке и выполните тесты с помощью этой команды.

mvn clean install

Отчет о выполнении, так как я интегрировал cluecumber-report-plugin для отчетов, я получу красивый красочный отчет, как показано ниже:

Надеюсь, это было полезно.

Пожалуйста, найдите весь проектВот

Дайте мне знать, если это было полезно. Если вам когда-нибудь понадобится моя помощь, вы можете написать в комментариях разделы. Кроме того, вы можете связаться со мной через мойLinkedInПрофиль.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map