Django 测试 - StaticLiveServerTestCase - client.cookies 如果之前有另一个测试用例则为空

Django testing - StaticLiveServerTestCase - client.cookies empty if there was another test case before

我正在 Docker 中使用 Selenium 测试我的 Django 应用程序。我遇到了一个与 cookies 可用性相关的特殊问题(我在测试中使用 cookies 进行身份验证)。

这是有效的代码:

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'

所以工作代码和不工作代码之间的唯一区别是虚拟测试函数,但它有什么变化?据我所知 setUptearDown 方法确保 "environment" 对于每个测试用例都是相同的,无论其他测试方法发生什么,这里它显然取决于运行 我的测试之前(不)存在其他测试用例...我有什么误解吗?还是某种错误?

我们将不胜感激。

我的设置:

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

我已经解决了,我把答案贴在这里以防其他人遇到类似问题。

所以这里的问题不在于测试用例顺序、Docker、Selenium 或代码本身中的任何内容,而是我不了解 class StaticLiveServerTestCase 的行为方式。也就是说,这个 class 继承自 LiveServerTestCase ,而 LiveServerTestCase 又继承自 TransactionTestCase ,后者在每个测试用例之后拆除数据库(并在另一个测试用例之前设置它) - 关于这个的更多信息可以是在 Django docs 中找到。当我在 setUpClass 中创建用户时 - 对于 class 中的所有测试用例,它是 运行 一次 - 它确实被创建但在任何之后被删除(与整个数据库一起)第一个测试用例。所以当我做 self.client.login(username="user", password="password") 时,这不是 cookie 或身份验证本身的问题,而是用户根本不存在的事实。

:-)