Как бы вы издевались над веб-приложением на Python (для тестирования проекта Django) - PullRequest
4 голосов
/ 25 ноября 2011

Мое приложение в Django записывает и импортирует данные из HTML другого приложения.Я протестировал каждую функцию синтаксического анализа и хотел бы проверить сканер, который будет проходить и через другое приложение.После этого я хотел бы сделать несколько интеграционных тестов.Чтобы сделать тесты настолько простыми, насколько это возможно, я хочу смоделировать импортированное веб-приложение, создав небольшое веб-приложение, которое обслуживает некоторый жесткий код HTML и имеет все пути, по которым я собираюсь пройти.

EDIT : Кроме того, мой макет должен иметь некоторые небольшие динамические поведения - например, для тестирования как неудачных, так и успешных входов в систему.Поэтому я не могу предоставить только статические файлы.

Как бы вы создали такое фиктивное приложение?Вы бы подкласс BaseHTTPServer?CGI?Использовать какой-нибудь фреймворк (как это делает твил, используя Quixote)?Или было бы разумно использовать Django для этого?Это решение, которое я хотел бы использовать, но Django кажется слишком сложным для такой проблемы;OTOH, другой фреймворк был бы слишком тяжелой зависимостью для такой маленькой потребности, а BaseHTTPServer слишком сырой, чтобы его использовать.

2nd EDIT : меня не интересуют насмешливые классы, запросыи т. д. и т. д. Это не тот подход, который я хочу использовать, и предложение использовать такой подход мне не ответит (хотя я благодарен милым людям, которые любезно предлагали мне до сих пор ),Если слишком сложно подумать о моем вопросе, просто забудьте, что я говорил о тестах - как бы вы грубо смоделировали веб-приложение с использованием Python в целом ?

Ответы [ 4 ]

2 голосов
/ 25 ноября 2011

Я думаю, вы издеваетесь не на том уровне. Ваш модульный тест вообще не должен зависеть от внешнего веб-сервера, даже если вы запускаете его специально для теста. Вам следует заменить объект urllib2.Request (или то, что вы используете для выполнения фактического HTTP-вызова) на объект, который просто возвращает предварительно сохраненные данные, включая соответствующие ответы для недействительных имен входа.

1 голос
/ 25 ноября 2011

Я бы загружал справочные страницы с помощью wget -r (рекурсивная загрузка), а затем делал загруженные страницы доступными как статические страницы с Apache, Nginx или чем-то еще, что вы используете в качестве веб-сервера.

Если только вытребуется увидеть динамические изменения из вашего веб-приложения ...

0 голосов
/ 28 ноября 2011

Я пытался следовать решению @Gagandeep Singh.Это казалось лучшим и, вероятно, хорошим решением в других ситуациях, но у меня это не сработало.

Проблема в том, что у меня было приложение Django в каталоге test другого приложения Django.Когда я запускал тесты моего приложения с manage.py test myapp, использованный settings.py был одним из всего проекта, а не файлом для моего приложения-макета.Я запускал Django через API управления и использовал multiprocessing, поэтому я уверен, что часть моей проблемы возникла из-за такого сложного взаимодействия.Возможно, я мог бы решить это, но я просто выбрал другую стратегию.

Я решил переопределить BaseHTTPServer и получил некоторые приемлемые результаты.Это нелегкая задача, но я успешно запустил свое приложение-шутник.

0 голосов
/ 26 ноября 2011

Похоже, вам нужно использовать Python Mock .Это позволяет, например, patch существующей команде (которая может вызывать внешний URL-адрес) и добавлять к ней свои собственные тестовые данные.

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

...