Дата публикации Oct 3, 2019
Эта статья является расширением моей предыдущей статьи на тему REST:
Наивным решением в 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Профиль.
© machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map