Песочница веб-сервисов с Python - PullRequest
4 голосов
/ 19 августа 2010

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

  • создание тестового прогона с помощью многопроцессорного BaseManager
  • chroot jail для каждой из служб, запускайте их как фоновую службу
  • попросить слушателя ответить на входящие соединения от служб и выложить данные

Это кажется нормальным? Другие идеи включают запуск каждого сервиса как процесса или создание для каждого сервиса собственного python virtualenv.

Ответы [ 5 ]

1 голос
/ 24 октября 2010

Вы определенно не хотите сначала проверять данные в реальном времени.Чтобы построить интеграционный тест, вы должны сначала смоделировать свои зависимости и использовать наборы ввода / вывода, которыми вы управляете.Ожидаемый ввод и вывод очень важен.Построение этих модульных тестов очень поможет вам при проведении интеграционного тестирования.

Что касается вашего конкретного вопроса, вы можете использовать прокси для перехвата данных или украсить вызывающую функцию, чтобы добавить ведение журнала.Посмотрите на Aspect Oriented Programming (AOP) для получения дополнительной информации о перехватчиках.

Если вы используете WSGI, вы можете написать промежуточное программное обеспечение для обработки перехвата и регистрации.Посмотрите на модуль CherryPy wsgiserver.py для помощи с этим;Django также использует промежуточное программное обеспечение, и его документы могут помочь с промежуточным программным обеспечением.

0 голосов
/ 22 ноября 2010

Вы можете играть с PyPy , если вам нужна чистая реализация Python.

0 голосов
/ 28 октября 2010

Возможно, вам следует сделать шаг назад и сначала задать несколько вопросов.

  • Какую самую важную часть испытать?
  • Насколько сложно настроить этот тест?
  • Стоит ли стоимость настройки теста, чтобы получить результаты теста?
  • Могу ли я протестировать большую часть того, что я хотел, с помощью более простого теста?

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

Если наиболее важная часть - это часть логики, которую можно проверить с помощью модульного теста с известными входами / выходами и имитациями.

Если тестирование интеграционной части действительно является наиболее важным, тогда я постараюсь найти баланс между макетированием как можно большего количества движущихся частей, насколько мне было удобно, чтобы сделать тест более управляемым.

Чем больше сетевых ресурсов вы используете, тем сложнее система и тем больше тестов она должна иметь. Вы должны подумать о проблемах синхронизации, времени безотказной работы, времени ожидания, состояниях ошибок и т. Д. Вы также можете попасть в ловушку создания теста, который не является детерминированным. Если ваше утверждение заканчивается поиском различий во времени, полагайтесь на определенные моменты времени или полагайтесь на ненадежную службу, которая ломает много; чем вы можете закончить с тестом, который бесполезен из-за количества «шума» от ложных положительных разрывов.

Если вы хотите использовать модель непрерывной интеграции, вам также необходимо учитывать сложности управления (запуск и завершение работы) или нескольких процессов при каждом запуске теста. В целом, вам легче управлять тестом, если вы можете сделать так, чтобы тест выполнялся одним процессом, а другие «процессы» были вызовами функций для соответствующих начальных точек в коде.

0 голосов
/ 23 сентября 2010

Одна из самых простых вещей - это иметь пул процессов Python, которые обслуживают запрос, затем завершаются и снова запускаются сценарием оболочки.Эта небольшая библиотека http://codespeak.net/execnet/ предоставляет очень минимальный сценарий для создания сервера, который прослушивает запрос и затем завершает работу.

Посмотрите на этот рецепт: Создание шлюзов через сокеты Iиспользовали его для создания простого кластера агностических процессов Python.Они могут выполнять небольшой код на Python, и если вы запираете тюрьму для каждой из служб, вы можете получить хороший уровень изоляции.

Кстати, я предлагаю вам избежать использования различных привилегий (sandobox) для тот же процесс Python .Это непрактично: например, несколько лет назад у Zope / Plone было много проблем, когда он размещался, потому что плохо спроектированный плагин мог уничтожить целый большой сайт.

Процессы Python быстро запускались и закрывались, иоперационная система может справиться с динамической нагрузкой лучше, чем с помощью кода приложения:)

0 голосов
/ 28 августа 2010

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

...