Django тестирование - StaticLiveServerTestCase - файл client.cookies пуст, если до этого был еще один тест - PullRequest
0 голосов
/ 13 апреля 2020

Я тестирую свое Django приложение с Selenium в Docker. Я сталкиваюсь с особенностью, связанной с доступностью файлов cookie (я использую файлы cookie для проверки подлинности в своих тестах).

Вот код, который работает:

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

from users.models import CustomUser


class SomeTest(StaticLiveServerTestCase):

    @classmethod
    def setUpClass(cls):
        cls.host = "web"  # Docker service name
        super().setUpClass()
        CustomUser.objects.create_user(username="user", password="password")

    def setUp(self):
        self.browser = webdriver.Remote("http://selenium:4444/wd/hub", DesiredCapabilities.FIREFOX)

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

    def test2(self):
        self.client.login(username="user", password="password")
        cookie = self.client.cookies["sessionid"]
        ...

Однако, когда я вставляю туда другой тест до test2, пусть это будет что-то столь же простое, как

    def test1(self):
        pass

, тогда код вылетает со следующей ошибкой:

Traceback (most recent call last):
  File "/home/mysite/functional_tests/test.py", line 28, in test2
    cookie = self.client.cookies["sessionid"]
KeyError: 'sessionid'

Так что единственная разница между рабочим и не- рабочий код - фиктивная тестовая функция, но что она меняет? Насколько мне известно, методы setUp и tearDown обеспечивают, чтобы «среда» была одинаковой для каждого теста, независимо от того, что происходит в других методах тестирования, и здесь она явно зависит от (не) существования другие тесты перед выполнением моего теста ... Что-то я неправильно понял? Или это какая-то ошибка?

Любая помощь будет оценена.

Моя настройка:

Django==2.2.5
selenium==3.141.0
Docker version - 19.03.5

1 Ответ

0 голосов
/ 18 апреля 2020

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

Таким образом, проблема здесь была не с порядком тестового набора, Docker, Selenium или чем-то еще в пределах сам код, но с моим отсутствием понимания того, как ведет себя класс StaticLiveServerTestCase. А именно, этот класс наследует от LiveServerTestCase, который, в свою очередь, наследует от TransactionTestCase, который разрушает базу данных после каждого тестового примера (и устанавливает его перед другим тестовым примером) - подробнее об этом можно узнать в Django документы . И поскольку я создавал пользователя в setUpClass - который запускается один раз для всех тестовых примеров в классе - он действительно был создан, но удален (вместе со всей базой данных) после любого первого тестового случая. Когда я делал self.client.login(username="user", password="password"), это не было проблемой с куки или аутентификацией как таковой, но с тем фактом, что пользователь просто не существовал.

: -)

...