Доступ к тест-серверу Django из теста Django - PullRequest
4 голосов
/ 18 июня 2009

Я хочу написать модульный тест, который выполняет 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) тест попытается снова инициализировать базу данных (после того, как тестовый сервер уже инициализировал его).

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

Спасибо.

1 Ответ

7 голосов
/ 18 июня 2009

Да, вы правы - это проблема, и в ней есть ошибка: 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 с помощью функции monkeypatching, и вместо этого вы можете использовать cherrypy http (что лучше в любом случае).

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

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

  • Пожалуйста, не сообщайте разработчикам Django об ошибках, вы сами по себе
  • Windmill предлагает такое же решение, поэтому, если вы используете ветряную мельницу, у вас, вероятно, будут конфликты портов
...