Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

При повторной отправке берется предыдущий Endpoint #366

Closed
nstreltsov opened this issue Nov 30, 2021 · 3 comments

Comments

@nstreltsov
Copy link

nstreltsov commented Nov 30, 2021

Привет.
Если отправлять один и тот же эндпоит два раза подряд, но заполнять разные параметры, то происходит неочевидное поведение - подставляются еще и параметры из первого запроса.
Например, при тестировании поиска есть эндпоинт с двумя полями (на самом деле их более 10):

@Endpoint(method = Rest.GET, host = "${api.baseURI}", path = "/api/v2/list.json", title = "Поиск")
public class TestEntry extends EndpointEntry {

    @Query(name = "search[status_not_eq]")
    private String statusNotEquals;

    @Query(name = "search[status_eq]")
    private String statusEquals;
}

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

* отправляет запрос "Поиск" с параметрами:
  | search[status_not_eq]    | archived                   |
# какие-то проверки
* отправляет запрос "Поиск" с параметрами:
  | search[status_eq]           | archived                   |
# какие-то проверки

В этом случае при отправке второго запроса будет заполнено еще и первое поле (search[status_not_eq]) - это происходит потому что в методе:

  public static EndpointEntry getEndpoint(String title) {
        if (null == EndpointContext.getCurrentEndpoint() || !EndpointContext.getCurrentEndpointTitle().equals(title)) {
            return getEndpointFromCache(title);
        }

        return EndpointContext.getCurrentEndpoint(); - ПРОБЛЕМА ТУТ
    }

будет браться текущий инстанс эндпоинта с уже заполненными полями из текущего запроса.

Сейчас сделали костыльный вариант - добавили еще один шаг, который пустой эндпоинт добавляет в текущий контекст. Но это выражается в том, что надо не забывать вызывать этот шаг в тесте, ну и тест выглядит уже не так изящно:

@И("^(?:пользователь |он )?очищает текущий запрос$")
public void removeCurrentEndpoint() {
    EndpointContext.setCurrentEndpoint(new EmptyEndpointEntry());
}

При разработке автотеста я ожидаю что при каждом выполнении шага "*отправляет запрос "Поиск" с параметрами" будет создаваться новый инстанс эндпоинта - это логичное и очевидное поведение.

Подскажите, пожалуйста, зачем берется текущий инстанс эндпонта в вашем методе public static EndpointEntry getEndpoint(String title)

@oversquall
Copy link
Contributor

oversquall commented Dec 1, 2021

@nstreltsov Так же столкнулся с этой проблемой.
Обошел созданием кастомного степдефа (костыля), где очищаю контекст перед отправкой:

И("^отправить rest-запрос '([^']*)' с параметрами:$")
public void send(String endpoint, DataTable dataTable) {
	EndpointContext.clear();
	new ApiStepDefs().send(endpoint, dataTable);
}

@clicman
Copy link
Member

clicman commented Dec 1, 2021

Посмотрим на неделе.

@kosteman
Copy link
Member

kosteman commented Dec 3, 2021

@clicman просто удалил return EndpointContext.getCurrentEndpoint() потому как не вспомнил почему было сделано именно так, тесты проходят

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants