Django LiveServerTestCase всегда сбой из-за конфликта адресов... Несмотря на отсутствие адреса

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

======================================================================
ERROR: setUpClass (fun_tests.tests.backend.TestCmsLogin)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/user/Documents/env/local/lib/python2.7/site-packages/django/test/testcases.py", line 1187, in setUpClass
    raise cls.server_thread.error
error: [Errno 98] Address already in use

Супер удовольствие, учитывая sudo netstat -netp | grep 8081 ничего не дает. Некоторые предпосылки: я использую Django 1.6, и я использую нос, джанго-нос, нос-исключаю, но я эффективно рубил их, чтобы помочь диагностировать проблему. Код, который я использую, прост:

from django.test import LiveServerTestCase
class TestCmsLogin(LiveServerTestCase):
    def test_a_test_itself(self):
        self.assertTrue(True)

Я не могу найти какой-либо предшествующий уровень техники по этому вопросу, а Djangoproject-трекер ошибок чист. Что мне не хватает?

Изменить: сегодня утром проблема невоспроизводима, независимо от того, что флаг 8081 был открытым, больше не вызывает проблем.

edit2: Mistyped 8081 as 8082 в моей записи, исправлено (и проверено, чтобы убедиться, что у меня это было в тот момент).

Ответы

Ответ 1

Вы можете установить (в settings.py) переменную окружения DJANGO_LIVE_TEST_SERVER_ADDRESS для включения нескольких диапазонов портов, которые будут предприняты:

os.environ['DJANGO_LIVE_TEST_SERVER_ADDRESS']="localhost:8000-8010,8080,9200-9300"

У той же самой проблемы, возможно, это помогает кому-то выйти.

Ответ 2

Это началось со мной при выполнении последующих тестов после того, как предыдущая из них вызвала ошибку внутреннего сервера. На mac используйте lsof, чтобы найти программу, используя порт, и убейте ее. Например:.

$ sudo lsof -i :8081
COMMAND    PID    USER   FD   TYPE            DEVICE SIZE/OFF NODE NAME
firefox-b 1097 username    3u  IPv4 0x94495559c6dea35      0t0  TCP localhost:sunproxyadmin (LISTEN)

$ kill -9 1097

Ответ 3

Если переменная среды DJANGO_LIVE_TEST_SERVER_ADDRESS не установлена, адрес по умолчанию для запуска сервера тестового тестирования - localhost: 8081. См. Код svc LiveServerTestCase.

  # Launch the live server thread
    specified_address = os.environ.get(
        'DJANGO_LIVE_TEST_SERVER_ADDRESS', 'localhost:8081')

Поскольку ОС, похоже, жалуется на используемый порт 8081. Можно быстро выбрать другой порт (скажем, 9000), выполнив тесты, как показано ниже.

/manage.py test functional_tests --liveserver :9000

Однако явная настройка DJANGO_LIVE_TEST_SERVER_ADDRESS была бы идеальной.

export DJANGO_LIVE_TEST_SERVER_ADDRESS="localhost:9000"

Ответ 4

Измените свой метод teardown, если вы собираетесь отделить свои тестовые примеры

Тестирование в одном файле в порядке использования метода .close()

def tearDown(self):
    self.browser.close()

Тестирование в нескольких файлах потребует запуска новых потоков.

def tearDown(self):
    self.browser.quit()