Запустите LiveServerTestCase из Docker Selenium с Django 1.11

Начиная с Django 1.11, опция --liveserver была удалена из команды manage.py test.

Я использовал эту опцию, чтобы разрешить доступ к liveserver с IP-адреса машины, а не с localhost, с помощью следующей команды:

./manage.py test --liveserver=0.0.0.0:8000

К сожалению, эта опция отсутствует, и я ищу новое решение, позволяющее моему образу Docker Selenium получить доступ к моему LiveServerTestCase во время тестов.


person VivienCormier    schedule 29.05.2017    source источник
comment
В некоторых случаях у вас может быть выделенная машина с Selenium, и вы хотите запускать свои django-тесты selenium на этой выделенной машине. Поэтому вам нужно открыть liveserver, отличный от локального хоста.   -  person VivienCormier    schedule 29.05.2017


Ответы (3)


Я нашел решение, переопределив StaticLiveServerTestCase и изменив свойство host.

Пример:

import socket

from django.contrib.staticfiles.testing import StaticLiveServerTestCase


class SeleniumTestCase(StaticLiveServerTestCase):

    @classmethod
    def setUpClass(cls):
        cls.host = socket.gethostbyname(socket.gethostname())
        super(SeleniumTestCase, cls).setUpClass()

В этом решении IP-адрес моей машины передается setUpClass из LiverServerTestCase, потому что значение по умолчанию это localhost.

Так что теперь мой liveserver доступен за пределами моего локального хоста, используя IP.

person VivienCormier    schedule 29.05.2017
comment
В чем разница между использованием cls.host = socket.gethostbyname(socket.gethostname()) и cls.host = 'web' в докере. @ВивьенКормьер - person StackEdd; 01.04.2020

С помощью этой темы и VivienCormier этот это то, что у меня работает с Django 1.11 и docker-compose

version: '2'
services:
  db:
    restart: "no"
    image: postgres:9.6
    ports:
      - "5432:5432"
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    env_file:
      - .db_env
  web:
    build: ./myproject
    command: python manage.py runserver 0.0.0.0:8000
    ports:
      - "8000:8000"
    volumes:
      - ./myproject:/usr/src/app
    depends_on:
      - db
      - selenium
    env_file: .web_env
  selenium:
    image: selenium/standalone-firefox
    expose:
      - "4444"

import os
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities


class TestHomePageView(StaticLiveServerTestCase):

    @classmethod
    def setUpClass(cls):
        cls.host = 'web'
        cls.selenium = webdriver.Remote(
            command_executor=os.environ['SELENIUM_HOST'],
            desired_capabilities=DesiredCapabilities.FIREFOX,
        )
        super(TestHomePageView, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        cls.selenium.quit()
        super(TestHomePageView, cls).tearDownClass()

    def test_root_url_resolves_to_home_page_view(self):

        response = self.client.get('/')
        self.assertEqual(response.resolver_match.func.__name__, LoginView.as_view().__name__)

    def test_page_title(self):

        self.selenium.get('%s' % self.live_server_url)
        page_title = self.selenium.find_element_by_tag_name('title').text
        self.assertEqual('MyProject', page_title)

.web_env файл

SELENIUM_HOST=http://selenium:4444/wd/hub
person DaeronAlagos    schedule 02.08.2017

Использование StaticLiveServerTestCase не кажется необходимым: тот же подход работает с его родительским классом:

class End2End(LiveServerTestCase):  
    host = '0.0.0.0'  # or socket.gethostbyname(...) like @VivienCormier did
person Arnaud P    schedule 25.10.2017
comment
LiveServerTestCase работает, но не предоставляет статические файлы. - person Marc Gibbons; 17.12.2017
comment
Хороший вопрос, спасибо. Я бы не заметил, так как я использую Django только для обслуживания API данных. - person Arnaud P; 18.12.2017