Выполнение асинхронных шагов с Cucumber (и/или Citrus)

Предположим, у меня есть тест, как показано ниже (с использованием огурца) -

Scenario: Login successfully to Facebook
  Given the user test exists
  And user name and password is entered
  When the login form is submitted
  Then I expose a HTTP-Rest service to validate the user name and password
  When I receive a validation success message
  Then display the welcome message to the user

Здесь, когда вызывается "the login form is submitted", он отправляет запрос в службу HTTP REST, которая передает имя пользователя и пароль в другую службу HTTP Rest (которая будет предоставлена ​​Citrus Framework), используя "I expose a HTTP-Rest service to validate the user name and password", которая проверяет данные и отправляет ответ об успешном завершении. . Поэтому определения шагов для "the login form is submitted" и "I expose a HTTP-Rest service to validate the user name and password" должны выполняться асинхронно.

Не могли бы вы помочь мне - как я могу добиться этого, используя огурец (или/и цитрусовые).

Примечание. Я не использую какое-либо приложение stub для предоставления службы HTTP Rest для "I expose a HTTP-Rest service to validate the user name and password; я пытаюсь предоставить службу с помощью Citrus framework.

Определения шагов написаны на языке java.


person bpa.mdl    schedule 29.08.2017    source источник
comment
Что, если вы позвоните Thread.sleep после шага the login form is submitted?   -  person alayor    schedule 29.08.2017
comment
Здравствуйте, пока не завершится выполнение Когда форма входа будет отправлена, огурец не будет выполняться. Я открываю службу HTTP-Rest для проверки имени пользователя и пароля. Я ищу что-то, с помощью чего я смогу выполнять эти шаги одновременно.   -  person bpa.mdl    schedule 30.08.2017


Ответы (1)


Прежде всего вам нужно настроить расширение citrus-cucumber в вашем проекте. Затем вы сможете использовать аннотацию @CitrusResource, которая вводит экземпляр исполнителя тестов в ваш класс шагов:

@CitrusResource
private TestRunner runner;

Также вы можете внедрить экземпляр http-сервера, который должен получить запрос.

@CitrusEndpoint(name = "userServer")
private HttpServer userServer;

Затем вы можете использовать средство запуска тестов и сервер для получения запроса и отправки ответа в определении шага:

@Then("^I expose a HTTP-Rest service to validate the user name and password$")
public void exposeHttpRestService() {
    runner.http(http -> http.server(userServer)
        .receive()
        .post()
        .payload("{\"username\": \"test\", \"password\": \"secret\"}"));

    runner.http(http -> http.server(userServer)
        .send()
        .response(HttpStatus.OK));
}

Форма входа должна быть отправлена ​​​​в отдельном определении шага с использованием отдельного потока, чтобы создать асинхронный характер:

@When("^the login form is submitted$")
public void submitForm() {
    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.submit(() -> {
        // do submit the form
    });    
}
person Christoph Deppisch    schedule 30.08.2017