Используя SimpleHTTPServer для поблочного тестирования

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

Однако я нашел проблему когда дело доходит до поблочного тестирования: поскольку я не выполняю сервисы, для которых я сделал этот модуль, я не хочу ковать их, но в то же время я должен получить данные для запущения моих тестов. Я посмотрел на 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, я сделал который замены реальная вещь. Как я могу убрать вещи корректно после того, как программа завершится?

15
задан Einar 31 December 2009 в 12:52
поделиться

2 ответа

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

class TestServer(SocketServer.TCPServer):
    allow_reuse_address = True

...
httpd = TestServer(("", PORT), handler)
11
ответ дан 1 December 2019 в 03:52
поделиться

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

По мере добавления юнит-тестов очень просто добавить возможности на этот сервер.

Мы запускаем сервер с помощью подпроцесса . http://docs.python.org/library/subprocess.html?highlight=subprocess#module-subprocess

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

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

.
4
ответ дан 1 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: