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'
所以工作代码和不工作代码之间的唯一区别是虚拟测试函数,但它有什么变化?据我所知 setUp
和 tearDown
方法确保 "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 或身份验证本身的问题,而是用户根本不存在的事实。
:-)
我正在 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'
所以工作代码和不工作代码之间的唯一区别是虚拟测试函数,但它有什么变化?据我所知 setUp
和 tearDown
方法确保 "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 或身份验证本身的问题,而是用户根本不存在的事实。
:-)