Аннотация: как разработчики определяют тайм-аут Integration TEST для HTTP-запросов?
Предыстория. У моей команды возникли проблемы, связанные с необычно длительными веб-запросами HTTP. Мы используем commons-httpclient
версию 3 от Apache. Код выглядит примерно так:
PostMethod post = new PostMethod(endpoint);
post.getParams().setSoTimeout(someInt);
httpClient.executeMethod(post);
Время выполнения этого запроса обычно является приемлемым (2 секунды или около того), но иногда мы будем видеть 50-60-секундные запросы, несмотря на то, что для нашего тайм-аута SO установлено значение 4 секунды. Это побудило меня провести некоторое исследование и обнаружило, что большинство людей устанавливают тайм-ауты соединения ANNNNND SO. Похоже, что тайм-ауты SO должны быть установлены ниже (поскольку они просто измеряют расстояние между байтами в пути), а тайм-аут соединения — это то, что мы изначально планировали использовать (т.е. начальная задержка между запросом и возвращенным 1-м байтом). Вот код, который мы собрали и планируем использовать:
httpClient.getHttpConnectionManager().getParams()
.setConnectionTimeout(someInt);
httpClient.getHttpConnectionManager().getParams()
.setSoTimeout(someInt);
Основная проблема здесь в том, что мы не можем провести интеграционное тестирование этого изменения. Точнее, мы запутались, как интеграционно протестировать задержки, исходящие от сокетного подключения к чужому серверу. Покопавшись в commons-httpclient
, я вижу защищенные и приватные классы, которые нам придется воспроизвести (поскольку они не расширяемы и непригодны для использования вне класса), имитировать и связывать классы вместе, чтобы в конечном итоге перейти к классу сокета в java (который зависит на методе java native
, который нам также нужно будет воспроизвести и внедрить с помощью макетов, что я не часто вижу на этом уровне).
Причина, по которой я обращаюсь к Stack Overflow, состоит в том, чтобы посмотреть, как другие тестируют это/не тестируют это. Я хочу любой ценой избежать тестирования этой функциональности в рабочей среде. Еще одна моя мысль заключалась в том, чтобы настроить фиктивный сервер для ответа на httpclient с программируемым временем задержки. Я еще не видел такого примера.