Django测试:User.authenticate失败
我在这个问题上纠缠了几个小时。我是django和自动化测试的新手,我一直在使用Selenium和django的StaticLiveServerTestCase。我一直在尝试测试我的登录表单(顺便说一句,当我使用runserver并自己测试它时,它工作得很好) 一切都很好,除了我似乎无法成功登录我的测试用户。我已经将断点缩小到django的User.authenticate方法 在我的设置中成功创建了用户对象,我可以通过在测试方法中访问它的属性来确认这一点。但是,身份验证失败 我已经查看了以下内容以寻求帮助,但它们并没有让我走得很远:Django测试:User.authenticate失败,django,selenium,django-authentication,django-tests,Django,Selenium,Django Authentication,Django Tests,我在这个问题上纠缠了几个小时。我是django和自动化测试的新手,我一直在使用Selenium和django的StaticLiveServerTestCase。我一直在尝试测试我的登录表单(顺便说一句,当我使用runserver并自己测试它时,它工作得很好) 一切都很好,除了我似乎无法成功登录我的测试用户。我已经将断点缩小到django的User.authenticate方法 在我的设置中成功创建了用户对象,我可以通过在测试方法中访问它的属性来确认这一点。但是,身份验证失败 我已经查看了以下内容
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from django.contrib.auth.models import User
from django.contrib.auth import authenticate
class AccountTestCase(StaticLiveServerTestCase):
def setUp(self):
self.selenium = webdriver.Chrome()
super().setUp()
User.objects.create(username='test', email='test@test.com', password='Test1234', is_active=True)
def tearDownClass(self):
self.selenium.quit()
super().tearDown()
def test_register(self):
user = authenticate(username='test', password='Test1234')
if user is not None: # prints Backend login failed
print("Backend login successful")
else:
print("Backend login failed")
user = User.objects.get(username='test')
print(user)
print(user.username) # prints test
print(user.password) # prints Test1234
我发现了问题。User.authenticate()方法散列提供的密码。但是,我在创建用户时直接设置了密码,这意味着它存储为Test1234,因此身份验证期间提供的哈希密码与“Test1234”不匹配,因此失败 要正确存储哈希密码,需要使用set_password()方法 更新的设置代码:
def setUp(self):
self.selenium = webdriver.Chrome()
super().setUp()
user = User.objects.create(username='test', email='test@test.com', is_active=True)
user.set_password('Test1234')
user.save()
用户身份验证正在通过,但当我尝试使用相同的凭据登录时,登录失败
from django.contrib.auth.models import User
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from django.test import Client
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.webdriver import WebDriver
import time
from django.contrib.auth import authenticate
#from apps.digital.models import User
class MyTests(StaticLiveServerTestCase):
port = 0
host = '<my host>'
def setUp(self):
super(MyTests, self).setUp()
self.selenium = WebDriver()
self.client = Client()
self.user = User.objects.create(username='test', email='test@test.com', is_active=True)
self.user.set_password('Test1234')
self.user.save()
def tearDown(self):
self.selenium.quit()
super(MyTests, self).tearDown()
def test_login(self):
self.user = authenticate(username='test', password='Test1234')
if self.user is not None: # prints Backend login failed
self.user = User.objects.get(username='test')
print(self.user.username) # prints test
print(self.user.password) # prints Test1234
self.login = self.client.login(username='test', password='Test1234')
self.assertEqual(self.login, True)
print("Backend login successful")
self.selenium.get('%s%s' % (self.live_server_url, '/admin/'))
username_input = self.selenium.find_element_by_name("username")
username_input.send_keys(self.user.username)
password_input = self.selenium.find_element_by_name("password")
password_input.send_keys('Test1234')
self.selenium.find_element_by_xpath('//input[@value="Log in"]').click()
time.sleep(1)
else:
print("Backend login failed")
来自django.contrib.auth.models导入用户
从django.contrib.staticfiles.testing导入StaticLiveServerTestCase
从django.test导入客户端
从selenium.webdriver.common.by导入
从selenium.webdriver.firefox.webdriver导入webdriver
导入时间
从django.contrib.auth导入验证
#从apps.digital.models导入用户
类MyTests(StaticLiveServerTestCase):
端口=0
主机=“”
def设置(自):
super(MyTests,self).setUp()
self.selenium=WebDriver()
self.client=client()
self.user=user.objects.create(username='test',email='1〕test@test.com“,是否为_active=True)
self.user.set_密码('Test1234')
self.user.save()
def拆卸(自):
self.selenium.quit()
super(MyTests,self).tearDown()
def测试_登录(自我):
self.user=authenticate(用户名='test',密码='Test1234')
如果self.user不是None:#打印后端登录失败
self.user=user.objects.get(username='test')
打印(self.user.username)#打印测试
打印(self.user.password)#打印Test1234
self.login=self.client.login(用户名='test',密码='Test1234')
self.assertEqual(self.login,True)
打印(“后端登录成功”)
self.selenium.get(“%s%s%”(self.live\u server\u url,/admin/))
username\u input=self.selenium.通过名称(“用户名”)查找元素
用户名\输入。发送\密钥(self.user.username)
password\u input=self.selenium.通过名称(“密码”)查找元素
密码输入。发送密钥('Test1234')
self.selenium.by_xpath('//input[@value=“Log in”]”)查找_元素。单击()
时间。睡眠(1)
其他:
打印(“后端登录失败”)
使用create\u superuser解决了该问题。下面的代码解决了这个问题
from django.contrib.auth.models import User
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from django.test import Client
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.webdriver import WebDriver
import time
from django.contrib.auth import authenticate
#from apps.digital.models import User
class MyTests(StaticLiveServerTestCase):
port = 0
host = 'my host'
def setUp(self):
super(MyTests, self).setUp()
self.selenium = WebDriver()
self.client = Client()
self.user = User.objects.create_superuser(username='test', password='Test1234', email='test@test.com', is_active=True)
self.user.save()
def tearDown(self):
self.selenium.quit()
super(MyTests, self).tearDown()
def test_login(self):
self.user = authenticate(username='test', password='Test1234')
if self.user is not None: # prints Backend login failed
self.user = User.objects.get(username='test')
print(self.user.username) # prints test
print(self.user.password) # prints Test1234
self.login = self.client.login(username='test', password='Test1234')
self.assertEqual(self.login, True)
print("Backend login successful")
self.selenium.get('%s%s' % (self.live_server_url, '/admin/'))
username_input = self.selenium.find_element_by_name("username")
username_input.send_keys(self.user.username)
password_input = self.selenium.find_element_by_name("password")
password_input.send_keys('Test1234')
self.selenium.find_element_by_xpath('//input[@value="Log in"]').click()
time.sleep(1)
else:
print("Backend login failed")
在安装程序中使用create_superuser方法解决了该问题。