Вопрос

Я хочу написать модульный тест, который напрямую выполняет HTTP-запросы (вместо использования django.test.client.Client).

Если вам интересно, почему — это потому, что я хочу протестировать API Thrift-over-HTTP, который я предоставляю из своего приложения Django, — и я хочу использовать клиент Thrift в модульном тесте.

Проблема в том, что во время тестов сервер фактически не запускается.При использовании django.test.client.Client он просто вызывает функции просмотра вместо фактического HTTP-запроса.(Поправьте меня, если я ошибаюсь.)

Итак, как лучше всего заставить тестовую среду запустить HTTP-сервер?

Я попробовал написать bash-скрипт, который делает что-то вроде этого:

./manage.py testserver --addrport 7000 &
PID=$!
sleep 5
./manage.py test --no-input
kill $PID

Но это беспорядочно (и на самом деле не работает), потому что 1) мне нужен сон (иначе тест начнется до того, как БД будет инициализирована тестовым сервером) и 2) тест попытается снова инициализировать базу данных (после тестовый сервер уже инициализировал его).

Есть ли другие решения этой проблемы?

Спасибо.

Это было полезно?

Решение

Да, вы правы — это проблема, и для нее есть ошибка: http://code.djangoproject.com/ticket/2879

Просто тогда вы можете столкнуться с многопоточными проблемами, намеренно опущенными: http://code.djangoproject.com/ticket/10117 http://code.djangoproject.com/ticket/4513 http://code.djangoproject.com/ticket/3357

Я расстроен, поэтому написал библиотеку, которая включает запуск работающего сервера в отдельном потоке и последующую его очистку: http://devel.almad.net/trac/django-sane-testing/ .Он также запускает многопоточный сервер Django с помощью обезьяньего исправления во время выполнения, и вместо этого вы можете использовать Cherrypy http (что в любом случае лучше).

Единственная проблема заключается в том, что вам необходимо использовать нос в качестве тестовой среды (100% обратная совместимость со стандартным модульным тестом, но если вы уже используете что-то другое...).Затем вы можете просто использовать --with-django и --with-djangoliveserver/--with-cherrypyliveserver.Понятия не имею, как это будет работать с бережливостью.

Просто будьте осторожны:

  • Пожалуйста, не беспокойте разработчиков Django отчетами об ошибках, вы сами по себе.
  • Windmill предоставляет то же решение, поэтому, если вы используете Windmill, у вас, вероятно, возникнут конфликты портов.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top