2013-12-16 11 views
14

Obecnie pracuję nad czyszczeniem moich testów funkcjonalnych Django, aby korzystać z LiveServerTestCase, zamiast odbijać testy oparte na selenach na wystąpieniu środowiska programistycznego działającego w tle i uderzyłem w ścianę. Za każdym razem staram się uruchomić test LiveServerTestCase, pojawia się następujący błąd:Serwer Django LiveServerTestCase zawsze nie działa z powodu konfliktu adresów ... Pomimo pojawienia się adresu Wolny

====================================================================== 
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 

super zabawa, zważywszy sudo netstat -netp | grep 8081 daje nic. Niektóre tła: używam Django 1.6 i używałem nosa, django-nosa, nosa-wykluczenia, ale skutecznie je odciąłem, aby pomóc zdiagnozować problem. Kod używam jest abysmally prosta:

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

nie mogę znaleźć żadnego stanu techniki w tej sprawie, a Djangoproject za bug tracker jest czysty. czego mi brakuje?

Edit: Dziś rano problem jest powtarzalna, co zostało słabnącym portowi 8081 jako otwarte nie jest przyczyną problemów.

Edit2: literówka 8081 a 8082 w moim writeup, stałe (i sprawdzane, aby upewnić się, że miał rację w tym czasie).

+1

Domyślnym portem jest 8081. – iMom0

Odpowiedz

12

Można ustawić (w settings.py) zmienną środowiskową DJANGO_LIVE_TEST_SERVER_ADDRESS zawierać wiele zakresów portów, które będą próbowały:

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

Miał ten sam problem sam, może to pomoże komuś na zewnątrz.

13

To zaczęło się dziać, gdy po kolejnych testach po poprzednim generowany był wewnętrzny błąd serwera. Na komputerze mac użyj lsof, aby znaleźć program za pomocą portu i go zabić. Np:

$ 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 
+1

W przypadku korzystania chromedriver, 'pkill chromedriver' Works (Linux) –

3

Jeśli zmienna środowiskowa DJANGO_LIVE_TEST_SERVER_ADDRESS nie jest ustawiony domyślny adres, aby uruchomić serwer testowy na żywo jest localhost: 8081. Zobacz kod src LiveServerTestCase.

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

System operacyjny wydaje się narzekać na używany port 8081. Można szybko wybrać inny port (np. 9000), uruchamiając testy, jak poniżej.

/manage.py test functional_tests --liveserver :9000 

Jednak idealnie byłoby ustawić ustawienie DJANGO_LIVE_TEST_SERVER_ADDRESS.

export DJANGO_LIVE_TEST_SERVER_ADDRESS="localhost:9000" 
0

zmienić metodę przerywaniem jeśli masz zamiar oddzielić przypadki testowe

Testowanie w jednym pliku jest w porządku, aby użyć metody .close()

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

Testowanie w wielu plikach wymagają rozruchu nowe wątki.

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

Wydaje się to może to być dobre rozwiązanie, ale trzeba rozszerzyć na nim, a także kod formatu jako kod (wybierz go i kliknij ikonę {}). – blm