2009-12-31 3 views
14

Я пишу модуль Python, который завершает определенный API веб-сервисов. Это все REST, поэтому относительно просто реализовать.Использование SimpleHTTPServer для модульного тестирования

Однако я обнаружил проблему, когда дело доходит до модульного тестирования: поскольку я не запускаю службы, для которых я создал этот модуль, я не хочу их забивать, но в то же время мне нужно получить данные для выполнения моих тестов. Я посмотрел на SimpleHTTPServer, и все будет в порядке.

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

Вот некоторые примеры кода

PORT = 8001 

handler = SimpleHTTPServer.SimpleHTTPRequestHandler 

httpd = SocketServer.TCPServer(("", PORT), handler) 

httpd_thread = threading.Thread(target=httpd.serve_forever) 
httpd_thread.setDaemon(True) 
httpd_thread.start() 

api_data = urllib.urlopen("http://localhost:8001/post/index.json") 
print "Data start:" 
print json.load(api_data) 

Где «index.json» является фиктивный JSON-файл я сделал, который заменяет реальную вещь. Как я могу чистить вещи изящно после завершения программы?

+0

SimpleHTTPServer действительно должен быть самым простым способом. Какие проблемы у вас есть? – balpha

+0

Я передумал, надеюсь, теперь все ясно. – Einar

ответ

11

Попробуйте использовать subclass of TCPServer with allow_reuse_address set True:

class TestServer(SocketServer.TCPServer): 
    allow_reuse_address = True 

... 
httpd = TestServer(("", PORT), handler) 
+0

блестящий! хорошо и просто – Claudiu

+0

Это не сработало для меня, но я смог решить это, установив SocketServer в методе setUpClass вместо метода setUp. Ошибка использования адреса, по-видимому, происходит во второй раз, когда вызывается метод setUp (что происходит, когда выполняется второй тест). – mlissner

4

Мы используем сервер, построенный на основе wsgiref. http://docs.python.org/library/wsgiref.html

Очень легко добавлять функции на этот сервер, когда мы добавляем модульные тесты.

Запустить сервер с помощью subprocess. http://docs.python.org/library/subprocess.html?highlight=subprocess#module-subprocess

Мы не используем нитки для такого рода испытаний. Зачем? (1) Наш сервер тестирования модулей довольно сложный, и мы хотели бы полностью изолировать его от клиентских приложений. (2) Наши клиентские приложения будут отдельными процессами на отдельном оборудовании, мы должны быть уверены, что у нас есть реалистичные ожидания производительности для этой конфигурации. (3) Это проще. (4) Он переносится на всех платформах. (5) Тривиальным является переход от автономного модульного тестирования к интеграционному тестированию с уже подобранным производством сервером.

На самом деле у нас есть небольшое приложение WSGI, которое делает работу сервера достаточно контролируемым образом, чтобы журналы были отключены правильно.

+0

Действительно, похоже, что подпроцесс может быть хорошей альтернативой. Будут исследовать дальше. – Einar

4

Старая нить, но ответы здесь не поможет мне, я использую HTTPServer, и закрытие после каждого испытания блока (по умолчанию HTTPServer имеет allow_reuse_address = 1 комплект). Однако я все еще получил адрес, уже использующий проблему после вызова shutdown. I исправлено с использованием:

from BaseHTTPServer import HTTPServer 

class MyHTTPServer(HTTPServer): 
    def shutdown(self): 
     self.socket.close() 
     HTTPServer.shutdown(self) 

Не знаете, почему это не происходит по умолчанию? Может быть, это не оптимально?