我正在为项目编写测试用例,并希望测试我的登录功能。我正在使用LiveServerTestCase
类selenium
并在Django网站[link](https://docs.djangoproject.com/en/1.8/topics/testing/tools/)中关注此文档。如果您看到以下代码:
from django.test import LiveServerTestCase
from selenium.webdriver.firefox.webdriver import WebDriver
class MySeleniumTests(LiveServerTestCase):
fixtures = ['user-data.json']
@classmethod
def setUpClass(cls):
super(MySeleniumTests, cls).setUpClass()
cls.selenium = WebDriver()
@classmethod
def tearDownClass(cls):
cls.selenium.quit()
super(MySeleniumTests, cls).tearDownClass()
def test_login(self):
self.selenium.get('%s%s' % (self.live_server_url, '/login/'))
username_input = self.selenium.find_element_by_name("username")
username_input.send_keys('rakesh')
password_input = self.selenium.find_element_by_name("password")
password_input.send_keys('ranjan')
self.selenium.find_element_by_xpath('//input[@value="Log in"]').click()
我的用户名是rakesh
,密码是ranjan
,我想知道为什么以下代码在这里失败了?我正确地发送我的参数,但它仍然不接受。
由于在每个测试用例中都创建了一个新的数据库,有没有办法在上面的代码中创建新的用户和密码?我对编写测试用例特别陌生,并会感谢任何帮助。
Error: loaddata.py:225: UserWarning: No fixture named 'user-data' found.
warnings.warn("No fixture named '%s' found." % fixture_name)
我也无法理解fixtures = ['user-data.json']
答案 0 :(得分:1)
Fixture是特定模型的初始数据集。您的测试用例将根据fixture文件创建测试数据库,表和插入数据。
您可以手动创建夹具或使用dumpdata
管理命令导出。由于密码是经过哈希处理的,因此更容易在应用程序中创建用户,然后将表数据导出为fixture:
$ python manage.py dumpdata auth.User --indent 4 > user-data.json
user-data.json将包含以下内容:
# app_name/fixtures/user-data.json
[
{
"fields": {
"username": "rakesh",
"password": "pbkdf2_sha256$15000$sDvLgitB2ieq$tGnZ4Vw+BVOnluucn0GyLzi1tV1dZEg=",
},
"model": "auth.user",
"pk": 1
}
]
要使用selenium检查测试您的登录过程,如果提交登录表单后的body.text包含特定文本:
def test_login(self):
self.selenium.get('%s%s' % (self.live_server_url, '/login/'))
username_input = self.selenium.find_element_by_name("username")
username_input.send_keys('rakesh')
password_input = self.selenium.find_element_by_name("password")
password_input.send_keys('ranjan')
#self.selenium.find_element_by_xpath('//input[@value="Log in"]').click()
# or submit with return key
from selenium.webdriver.common.keys import Keys
password_input.send_keys(Keys.RETURN)
body = self.selenium.find_element_by_tag_name('body')
self.assertIn(u'Welcome rakesh, you have successfully logged in.', body.text)
答案 1 :(得分:1)
我强烈建议您使用工厂而不是JSON夹具。它更易读,易于维护。
在您发送的示例中,我想知道密码是否正确加密。
示例:
java.util.TimeZone
:
factories.py
在你的测试中:
from django.contrib.auth.hashers import make_password
from factory import DjangoModelFactory, Sequence
class UserFactory(DjangoModelFactory):
class Meta:
model = User
# this is just an example; you need the required fields on your actual User Model
email = Sequence(lambda n: 'john-doe-{0}@a.com'.format(n))
username = Sequence(lambda n: 'john_doe_{0}'.format(n))
password = make_password("password")
显然,如果以下情况仍未通过:
def test_login(self):
rakesh = UserFactory.create(
username="rakesh",
password=make_password("ranjan")
)
self.selenium.get('%s%s' % (self.live_server_url, '/login/'))
...
确保打印 body = self.selenium.find_element_by_tag_name('body')
self.assertIn(u'Welcome rakesh, you have successfully logged in.', body.text)
以找出错误。