Я пишу модуль 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, я сделал который замены реальная вещь. Как я могу убрать вещи корректно после того, как программа завершится?
Попробуйте использовать подкласс TCPServer с allow_reuse_address
set True:
class TestServer(SocketServer.TCPServer):
allow_reuse_address = True
...
httpd = TestServer(("", PORT), handler)
Мы используем сервер, построенный на 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, которое делает выключение сервера разумно контролируемым, так что логи завершаются должным образом.
.