Подтвердить что ты не робот

Какой подход вы использовали для легких модульных тестов Python в App Engine?

Я собираюсь приступить к некоторым крупным проектам App Engine на основе Python, и я думаю, что перед тем, как перейти к стратегии тестирования модулей, я должен проверить "Премудрость толпы" Stack Overflow. У меня есть существующая инфраструктура модульного тестирования (основанная на unittest с пользовательскими бегунами и расширениями), которые я хочу использовать, поэтому все "weight" / "intrusive", например nose, webtest, или gaeunit, не кажется подходящим. Важнейшие модульные тесты в моем мировоззрении чрезвычайно легкие и быстрые, те, которые работают в очень короткое время, поэтому я могу постоянно их запускать, не нарушая ритм развития (например, для другого проекта, я получаю 97% или около того охват проекта 20K-линий с несколькими десятками сверхбыстрых тестов, которые занимают 5-7 секунд, истекшее время, для типичного запуска, в целом - то, что я считаю достойным набором небольших, тесты). Разумеется, у меня будут более богатые и тяжелые тесты, вплоть до интеграционных тестов с селеном или ветряной мельницей, что не, о чем я прошу;-) - мое внимание в этом вопросе ( и в большинстве моих усилий по развитию;-) находится на небольших, легких модульных тестах, которые легко и очень быстро охватывают мой код, а не на более глубоких.

Итак, я думаю, что мне нужно, по сути, набор небольших, очень легких симуляций различных подсистем подсистемы App Engine - хранилищ данных, memcache, объектов запроса/ответа и вызовов для обработчиков webapp, обработки пользователей, почты и c, примерно в этом порядке приоритета. Я не нашел точно, что я ищу, поэтому мне кажется, что я должен либо полагаться на mox, часто выполняли в прошлом, что в основном означает насмехание каждой подсистемы, используемой в данном тесте, и создание всех ожиданий & c (сильный, но много работы каждый раз и очень чувствительный к внутренним компонентам тестируемого кода, то есть очень "белый" -box "y) или катить мое собственное моделирование каждой подсистемы (и делать утверждения в состояниях смоделированных подсистем как часть единичных тестов). Резервы кажутся осуществимыми, учитывая сильную архитектуру" заглушек "GAE Python, но я не могу поверить, что мне нужно сворачивать свои собственные, т.е. Что никто уже не написал таких простейших симуляторов!) Например, для хранилища данных, похоже, что мне нужна более или менее" заглушка в хранилище данных ", которая уже входит в состав SDK, а также способ отметить ее только для чтения и простых в использовании аксессуаров для утверждений о состоянии хранилища данных; и т.д., подсистема подсистемой - каждая, по-видимому, нужна" чуть больше ", чем то, что уже в SDK," взгромоздилось поверх "существующей архитектуры" заглушек".

Итак, перед тем, как погрузиться и потратить день или два драгоценного времени разработки, "сворачивая мои собственные" симуляции подсистем GAE для целей единичного тестирования, я подумал, что я дважды проверю с толпой SO и посмотрю, что вы думаете из этого... или, если уже существует какой-то существующий набор с открытым исходным кодом таких симуляторов, который я могу просто повторно использовать (или минимально настроить... -), и который я просто не обнаружил при поиске! -)

Изменить: уточнить, если я действительно откажусь от своего собственного, я планирую использовать поставляемые SDK заглушки, где это возможно; но, например, там нет заглушки для хранилища данных, которое изначально считывается из файла, но затем не сохраняется в конце, поэтому мне нужно подклассировать и настроить существующий (что также не предлагает особенно удобные способы делать утверждения на его состояние - то же самое для заглушки почтовой службы и т.д.). Это то, что я имею в виду под "прокатки собственного", а не "переписывания с нуля"! -)

Изменить: "почему бы не GAEUnit" - GAEUnit хорош для собственных случаев использования, но запуск dev_appserver и просмотр результатов в моем браузере (или даже через urllib.urlopen) определенно не то, что я После этого я хочу использовать полностью автоматизированную настройку, подходящую для работы в рамках существующей тестовой среды, основанной на расширении unittest и отсутствии HTTP на пути (указанная среда определяет "быстрый" тест как один из другая вещь не имеет сокетов и минимального дискового ввода-вывода - мы имитируем или издеваемся над ними - поэтому через gaeunit я мог бы сделать не лучше, чем "средние" тесты) + нет удобного способа предварительного заполнения хранилища данных для каждого теста (и никакой структуры OO для помогите настроить вещи).

4b9b3361

Ответ 1

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

Ответ 2

NoseGAE - это плагин для носа, который поддерживает unittests, автоматически настраивая среду разработки и тестовое хранилище данных для вас. Очень полезно при разработке на dev_appserver.

Ответ 3

Я использую GAEUnit для своего приложения Google App Engine, и я вполне доволен скоростью тестов. То, что мне нравится в GAEUnit, и я уверен, что Webtest делает это, заключается в том, что он создает свою собственную версию для заглушек всего для тестирования, оставляя ваши "живые" версии только для тестирования.

Таким образом, ваше хранилище данных, которое вы можете использовать для разработки, останется таким же, как и при запуске ваших GAETests.

Ответ 4

Я также могу добавить, что Fixture был очень полезен в моих модульных тестах. Он позволяет создавать модели в декларативном синтаксисе, который преобразуется в хранимые объекты, которые вы можете загрузить в своих тестах. Таким образом, у вас есть тот же набор данных в начале каждого тестового примера!, что избавляет вас от необходимости создавать данные вручную в начале каждого теста. Вот пример из документации Fixture: Учитывая эту модель:

from google.appengine.ext import db

class Entry(db.Model):
    title = db.StringProperty()
    body = db.TextProperty()
    added_on = db.DateTimeProperty(auto_now_add=True)

Ваше устройство будет выглядеть так:

from fixture import DataSet

class EntryData(DataSet):
    class great_monday:
        title = "Monday Was Great"
        body = """\
Monday was the best day ever.
"""

Обратите внимание, однако, что я столкнулся с следующими проблемами: 1. Эта ошибка, но включенный патч исправляет ее. 2. Хранилище данных не установлено по умолчанию - reset между тестовыми примерами. Поэтому я использую это для принудительного reset для каждого тестового примера:

class TycoonTest(unittest.TestCase):
    def setUp(self):
        # Clear out the datastore before starting the test.
        apiproxy_stub_map.apiproxy._APIProxyStubMap__stub_map['datastore_v3'].Clear()    
        self.data = self.load_data()
        self.data.setup()
        os.environ['SERVER_NAME'] = "dev_appserver"
        self.after_setUp()

    def load_data(self):
        return datafixture.data(*dset.__all__)

    def after_setUp(self):
        """ After setup
        """
        pass

    def tearDown(self):
        # Teardown data.
        try:
            self.data.teardown()
        except:
            pass

Ответ 5

SDK 1.4.3 Тестирование API обеспечивает простоту конфигурация библиотек-заглушек для тестов локальной интеграции.

Ответ 6

Поскольку 1.3.1 версия SDK существует встроенный unit test рамки.

Это Java только сейчас, но я чувствую:

  • это то же самое, о чем вы говорите в своем вопросе (и многое другое - как тест на запуск в облаке, например)
  • и вполне возможно, что port\реализуется на Python с помощью SDK

Так делает автор этой структуры - Макс Росс, и он прямо рассказывает об этом в своей презентации ввода/вывода Методы тестирования для Google App Engine

Есть ли у кого-нибудь обновления по этой теме?