2010-04-13 2 views
2

Я пишу пару простых приложений WSGI, чтобы получить представление о стандарте, и я хочу сказать, что мои приложения работают так, как ожидалось. Теперь я пытаюсь найти лучший способ начать и остановить сервер, на котором размещаются эти приложения.Лучший способ запуска функциональных тестов приложения 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, но это кажется ужасной проблемой.

Спасибо.

ответ

3

Лучший способ тестирования приложений 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': '[email protected]', '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) 
+0

По моему опыту, введение зависимости (по крайней мере для тестирования) на WebTest хорошо, стоит того. Удачи! –

1

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

+0

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

Смежные вопросы