2015-09-05 1 views
7

per l'esecuzione di test che di solito eseguire un contenitore separato con:esecuzione di test Django con selenio in finestra mobile

docker-compose run --rm web /bin/bash 

Dove web è un contenitore con Django. Da una shell eseguo py.test di volta in volta.

Per poter raggiungere il selenio da un contenitore con django e per consentire al browser del contenitore di selenio di raggiungere il server del django, ho deciso di utilizzare il parametro "net" che consente ai contenitori di condividere la rete. Quindi l'ho aggiunto a yml:

selenium: 
    image: selenium/standalone-firefox 
    net: "container:web" 

Purtroppo questo non funziona. Non vedo 4444 porte nel mio contenitore django.

Funziona solo se al posto di si specifica il nome di un contenitore generato automaticamente, ad esempio net:"container:project_web_run_1".

Inoltre ho cercato invece di docker-compose run --rm .... uso docker-compose up --no-deps cambiare command parametro py.test functional_tests, ma che non ha funzionato neanche.

È questo il diritto di utilizzare il selenio con i contenitori?

risposta

5

Ecco come lo faccio. Il problema di base è che la sessione di composizione del docker genererà un nome host diverso (project_container_run_x) dove x è difficile da sapere con certezza. Ho finito per uscire dall'indirizzo IP. Sto anche assicurando che DEBUG sia Falso altrimenti ricevo una cattiva richiesta.

sto usando StaticLiveServerTestCase come questo:

import os 
import socket 

os.environ['DJANGO_LIVE_TEST_SERVER_ADDRESS'] = '0.0.0.0:8000' 

class IntegrationTests(StaticLiveServerTestCase): 
    live_server_url = 'http://{}:8000'.format(
     socket.gethostbyname(socket.gethostname()) 
    ) 

    def setUp(self): 
     settings.DEBUG = True 
     self.browser = webdriver.Remote(
      command_executor="http://selenium:4444/wd/hub", 
      desired_capabilities=DesiredCapabilities.CHROME 
     ) 

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

    def test_home(self): 
     self.browser.get(self.live_server_url) 

Il mio file finestra mobile-composizione ha questo per il selenio ed estende il contenitore web (dove Django è in esecuzione). La porta 5900 è aperta per VNC. Mi piace tenere questo isolato in qualcosa come finestra mobile-compose.selenium.yml

version: '2' 
services: 
    web: 
    environment: 
     SELENIUM_HOST: http://selenium:4444/wd/hub 
     TEST_SELENIUM: 'yes' 
    depends_on: 
     - selenium 

    selenium: 
    image: selenium/standalone-chrome-debug 
    ports: 
     - "5900:5900" 

posso eseguire i test come

docker-compose run --rm web ./manage.py test 

Quindi il mio web container sta accedendo selenio attraverso l'host "selenio". Il selenio quindi accede al contenitore web per indirizzo IP che viene determinato al volo.

Un altro trucchetto è che si è tentati di utilizzare semplicemente "web" come nome host. Se il comando di esecuzione della finestra mobile-compose avvia un contenitore Web separato, sembra che funzioni. Tuttavia non userà il tuo database di test, facendo per non un grande test.

+1

È anche possibile impostare l'URL del server di vita nell'ambiente in modo che non sia necessario passarlo ogni volta sulla riga di comando, impostando 'DJANGO_LIVE_TEST_SERVER_ADDRESS'. –

0

Ho appena specificato host='web' per LiveServerTestCase. Ecco la mia soluzione di lavoro.

test.py

from django.test import LiveServerTestCase 
from selenium import webdriver 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 

class FunctionalTestCase(LiveServerTestCase): 
    host = 'web' 
    def setUp(self): 
     self.browser = webdriver.Remote(
      command_executor="http://selenium:4444/wd/hub", 
      desired_capabilities=DesiredCapabilities.FIREFOX 
     ) 

    def test_user_registration(self): 
     self.browser.get(self.live_server_url) 
     self.assertIn('Django', self.browser.title) 

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

docker-compose.yml

version: '3' 
services: 
    db: 
    image: postgres 
    web: 
    build: . 
    ports: 
     - "8000:8000" 
    depends_on: 
     - db 
     - selenium 
    selenium: 
    image: selenium/standalone-firefox 
0

Nel mio caso, il contenitore "web" corre un solo comando, che è bash -c "sleep infinity".

Quindi, avvio l'intero stack con docker-compose up -d.

Quindi, io uso docker-compose exec web bash -c "cd /usr/src/app && tox", ad esempio.

In questo modo, il mio host web è accessibile da selenium, sempre con lo stesso nome.

L'utilizzo di docker-compose run web ... genera un nuovo nome host (prevedibile, ma comunque) ogni volta.