Как повторно запустить предыдущий шаг Cucumber, основываясь на логическом утверждении на более позднем шаге? - PullRequest
0 голосов
/ 21 сентября 2018

Я тестирую, учусь использовать Огурец и у меня есть Сценарий следующим образом:

Given a standard party
And a flight from "UK" to "Europe"
When I search
And I receive search results
Then I can book my holiday

В шаге «Определение шага 2» я запрашиваю базу данныхиспользуя JDBI и получить набор данных, который я могу перебрать и использовать в качестве данных поиска для шага 3 в API, к которому я отправляю запросы.Довольно часто не получают никаких результатов в первых 2 или 3 запрашиваемых строках.Это бесполезно для меня, потому что сценарий на самом деле не проверяет, возвращаются ли результаты (хотя это явно допустимый сценарий).

Что я действительно хочу, так это вернуть результаты, а затем утверждать, что я могу забронировать- в пределах этого Step Def проверяются на правильную цену и т. д. *

Итак, если

And I receive search results

равно false, как я могу вернуться к

And a flight from.....
* 1017?* ... чтобы я мог попробовать следующий ряд данных.

Мой запрос в контексте определений шага огурца, какой это лучший / идиоматический способ сделать это, учитывая, что для каждого цикла находится на более раннем шаге?

Существует ли общее соглашение о повторных попытках в таких случаях?Я не могу просто вызвать базовый метод поиска снова, потому что у меня есть много методов Step Def поиска, все приклеенные к шагам, и «И я получаю ...», в котором я получаю объект ответа, не имеет понятия предыдущего шага.

И рейс из "Великобритании" в "Европу":

 @And("^a flight from \"([^\"]*)\" to \"([^\"]*)\"$")
public void aFlightFromContinentOneToContinentTwo(String continentOne, String continentTwo) {

    airportsAndDates = searchWorld.airportsAndDates();

    supplierCode = supplierCredentials.getSupplierCode();
    ReposMasterConnection rm = new ReposMasterConnection();

    origins = getContinentOne(continentOne);
    destinations = getContinentTwo(continentTwo);

    rm.initialiseDatabaseConnection();

    List<FlightDataBean> dataSet = rm.lastFlightBookedResultsByRegion(supplierCode, origins, destinations);

    for (FlightDataBean i : dataSet) {
        String startDate = i.getStartDate();
        String endDate = i.getEndDate();
        String origin = i.getOrigin();
        String destination = i.getDestination();

        String start = getStartDate(startDate);
        String end = getEndDate(endDate);

        if (startDate != null) {

            DateRange dateRange = new DateRange()
                    .withStartDate(start)
                    .withEndDate(end);

            airportsAndDates.
                    withDepartureDateRange(dateRange).
                    withDepartureAirports(departureAirportList(origin)).
                    withDestinationChoice(destinationChoice(destinationAirportList(destination)));
        }
    }
}

Когда я ищу ... // еще один Stepdef, который отправляет запрос

Затем я получаюрезультаты поиска:

@Then("^I receive search results$")
public void iReceiveSearchResults() {

    response = given().contentType(ContentType.XML).body(packageAvailRequest).when().post().then().extract().response();
    String status = requestWorld.getAppRequest().getAvailabilityResponseObject().getSearchResponseStatus(response);

    requestWorld.getAppRequest().getAvailabilityResponseObject().setResponse(response);

    errorMessage = requestWorld.getAppRequest().getFirstBasketResponseObject().getError(response);
    warningMessage = requestWorld.geAppRequest().getFirstBasketResponseObject().getWarning(response);

    if (errorMessage != null && !errorMessage.isEmpty()) {
        scenario.write("Error: " + errorMessage);
    }
    if (warningMessage != null && !warningMessage.isEmpty()) {
        scenario.write("Warning: " + warningMessage);
    }

    assertEquals("true", status);
}

Ясно, что мне не нужно иметь цикл для каждого цикла в шаге И, но есть какой-то способ перемещения курсора на следующую строку данных.

...