Лучший способ запустить функциональные тесты приложения WSGI? - PullRequest
2 голосов
/ 13 апреля 2010

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

Моей первой мыслью было запустить SimpleServer из wsgiref в методе setUp и выключить его в методе tearDown. Так как serve_forever блоков, я сделал эту работу в отдельном Thread. К сожалению, если я использую serve_forever для запуска сервера, вторичный поток, в котором он находится, никогда не умирает, и получается, что threading не предоставляет способа убить Thread.

Теперь я рассматриваю возможность использования чего-то подобного в качестве run реализации на сервере Thread:

while keep_going:
    httpd.handle_request()

, где keep_going - это переменная, которую я установил на True в моем setUp и на False в моем tearDown.

Есть ли лучший способ? Я надеялся написать эти приложения и тесты, используя только стандартную библиотеку - чтобы лучше понять, что я абстрагирую, когда я использую lib / framework - но это кажется огромной проблемой.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 13 апреля 2010

Лучший способ протестировать приложения WSGI - WebTest , который устраняет необходимость создавать тестовые серверы для вашего приложения. Вместо этого он позволяет отправлять HTTP-запросы в приложение WSGI как вызовы методов для объекта TestApp:

>>> from webtest import TestApp
>>> from myapp import my_wsgi_app
>>> app = TestApp(my_wsgi_app)
>>> res = app.get('/')
>>> res.status
'200 OK'
>>> res.status_int
200
>>> params = {'email': 'foo@example.com', 'password': 'foo', }
>>> res = app.post('/login/', params)
>>> res.status_int
302

У меня обычно есть базовый тестовый класс, который добавляет в мои тесты атрибут self.app, который указывает на экземпляр TestApp для приложения WSGI, которое я тестирую. Поэтому мои методы испытаний выглядят примерно так:

def test_index_page(self):
    res = self.app.get('/')
    self.failUnlessEqual(res.status_int, 200)
1 голос
/ 13 апреля 2010

Я не думаю, что SimpleServer когда-либо был предназначен для работы в потоке. Возможно, вам лучше начать SimpleServer в отдельном процессе, например, используя модуль subprocess в stdlib. Затем вы можете вызвать / убить процесс в ваших setUp и tearDown методах.

...