Тестирование сетевых приложений на Python

Случай 1.
В своём Python приложении выполняю «простое» действие с определённым сайтом или удалённым компьютером. Например ping или получение HTML содержимого сайта. И хочу проверять этот метод это в Unit-тесте. Но тестировать на реальном сайте по понятным причинам не вариант.

Вопрос: как в таких случаях делается обёртка (wrapper) вокруг моего скрипта, которая перехватывает сетевые запросы и которую я могу настроить по своему желанию?

Случай 2.
В своём Python приложении хочу выполнить «сложное» действие с определенным сайтом. Например хитро распарсить его содержимое. Но есть опасение, что если я буду долго возиться с сайтом, дебажить свои запросы «на живую», администратор сайта может просечь это и забанить.

Вопрос: существуют ли инструменты автоматизации, которые делают максимально похожую копию веб-сайта на моём компьютере? Или в таких случаях это делается вручную с использованием каких-нибудь веб-фреймворков?

Случай 3.
Хочу потестировать самописное клиент-серверное приложение на более-менее живой сети, пусть и эмулируемой. Первая мысль: взять виртуальную машину, создать N машин, установить туда операционки… Но это тяжеловесно и требует кучи памяти.
Может быть существует легковесная программа, реализующая только сетевой стек «как во взрослых ОС» и интерпретатор Python?
  • Вопрос задан
  • 5681 просмотр
Пригласить эксперта
Ответы на вопрос 5
stepank
@stepank
1. можно поднять веб-сервер в отдельном потоке или процессе, этот веб-сервер может эмулировать работу сайта. конкретных вариантов, как это сделать, очень много: threading, multiprocessing, использование библиотек типа gevent или twisted

2. есть море программ, которые позволяют сделать «копию» сайта. самый простой вариант — наверное, wget, он можно вытянуть едва ли не весь сайт одной командой, умеет ходить по ссылкам. дальше поднимается веб-сервер (возможно одним из вариантов, упомянутых в 1) и на этом чуде можно тестироваться

3. если говорить про виртуалки, то это вполне рабочий вариант, для тестирования питонячих приложений должно хватить по 256мб на машину, 4 машины — это гигабайт оперативки, что вполне подъемно для любой тачки с 4гб памяти. если же хочется чего-то попроще, то ничто не мешает, как уже упоминали, просто коннектиться к локалхосту, программы запускаются или в разных процессах, или даже в разных потоках. для тестирования падений сети, задержек, дисконнектов и прочего можно использовать самописные tcp прокси (мы так и делаем), проксей можно очень по-разному управлять, эмулирую самые разные «печальные» ситуации

зы. несколько виртуалок можно легко поднять с помощью vagrant, а установить на них нужный софт можно с помощью puppet, chef, salt — по вашему вкусу
Ответ написан
Комментировать
truekenny
@truekenny
Для второго случая мне подходит кеширование ответов по ключу URL, может и вам подойдёт.
Ответ написан
Комментировать
nochkin
@nochkin
Мне кажется что мало информации и слишком уж расплывчато, поэтому и ответы такие:

1. Можно сделать запросы низкого уровня отдельно от работы выского уровня и просто подменять модуль низкого уровня или конфигурировать его, а верхний уровень с unit-тестами меняться не будет.

2. Можно кешировать как посоветовали выше. Если что-то просто, то я просто подменял и читал локальные файлы, которые предварительно утянул с сайта на определённые свои запросы.

3. Я не очень понял зачем виртуальные машины. Если писать питоновские скрипты и каждый будет выполняться независимо, то машины не нужны. У каждого будут свои куки, окружение, свой конфиги и прочее. Просто запустить параллельно.
Ответ написан
un1t
@un1t
На Питоне есть очень удобные билиотеки для патчинга функций и атрибутов на лету для тестов. Мы используем flexmock. С ее помощью например можно подменять функции библиотеки urllib (или любой другой), тогда ваша функция не будет делать реальных запросов в сеть, а будет возвращять, то что вам нужно.
Вот тут есть презентация, смотрите с 47го слайда pycon.ru/program/content/test-driven-development/
Ответ написан
Комментировать
renskiy
@renskiy
Какие сложные ответы ) Если вопрос еще актуален, то самый простой способ написания модульных тестов в изоляции от внешних источников данных — это использование Mock фреймворков (например mox).

3-й вопрос также решается без изобретения велосипедов утилитами для тестирования нагрузки. Самый простой пример такой утилиты — Apache Bench. Знаю, что в природе есть и более комплексные решения, которые вы можете поискать сами.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы