2015-09-05 12 views
7

Für Tests Ausführen ich laufen in der Regel über einen separaten Behälter mit:Lauf django Tests mit Selen in Docker

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

Wo Bahn ein Behälter mit django ist. Von einer Shell aus führe ich py.test von Zeit zu Zeit aus.

Um Selen aus einem Container mit Django erreichen zu können und dem Browser aus Selencontainer den Django-Liveserver zu ermöglichen, habe ich mich für den net-Parameter entschieden, der es erlaubt, Container net zu teilen. So fügte ich es zum yml hinzu:

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

Leider funktioniert das nicht. Ich sehe keinen 4444-Port in meinem Django-Container.

Es funktioniert nur, wenn ich anstelle von net:"container:web" einen automatisch generierten Container-Namen, wie net:"container:project_web_run_1" angeben.

Auch habe ich versucht, statt docker-compose run --rm .... Verwendung docker-compose up --no-depscommand Parameter py.test functional_tests ändert, aber das hat nicht funktioniert entweder.

Ist dies das Recht, Selen mit Behältern zu verwenden?

Antwort

5

Hier ist, wie ich es mache. Das Grundproblem ist, dass docker-compose run einen anderen Hostnamen (project_container_run_x) erzeugt, in dem x schwer zu erkennen ist. Ich landete einfach von der IP-Adresse. Ich stelle auch sicher, dass DEBUG False ist, sonst bekomme ich eine schlechte Anfrage.

Ich verwende StaticLiveServerTestCase wie folgt aus:

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) 

Meine Docker-compose Datei hat das für Selen und erweitert den Web-Container (wo django läuft). Port 5900 ist offen für VNC. Ich mag diese isoliert in etwas zu halten, wie Docker-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" 

I Tests wie

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

So greift auf meine Web-Container Selen über die "Selen" Host ausgeführt werden kann. Selenium greift dann auf den Web-Container mit der IP-Adresse zu, die im laufenden Betrieb ermittelt wird.

Ein weiterer Fehler ist, dass es verlockend ist, einfach "web" als Hostnamen zu verwenden. Wenn mit dem Befehl docker-compose run ein separater Webcontainer gestartet wird, scheint dies zu funktionieren. Es wird jedoch nicht Ihre Testdatenbank verwenden, so dass es kein guter Test ist.

+1

Sie könnten auch die Liveserver-URL in der Umgebung festlegen, sodass Sie sie nicht jedes Mal in der Befehlszeile übergeben müssen, indem Sie 'DJANGO_LIVE_TEST_SERVER_ADDRESS' festlegen. –

0

Ich habe gerade host='web' für LiveServerTestCase angegeben. Hier ist meine Arbeitslösung.

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

In meinem Fall läuft der "Bahn" Container nur einen Befehl, der bash -c "sleep infinity" ist. Dann starte ich den ganzen Stack mit docker-compose up -d.

Dann verwende ich zum Beispiel docker-compose exec web bash -c "cd /usr/src/app && tox".

Auf diese Weise ist mein web Host von selenium, immer unter dem gleichen Namen.

Die Verwendung von docker-compose run web ... generiert jedes Mal einen neuen (vorhersagbaren, aber immer noch) Hostnamen.