Как проверить функциональность входа в систему с помощью LiveServerTestCase и Selenium в Django
Я пишу тестовые примеры для проекта и хочу проверить функциональность моего входа в систему. я использую LiveServerTestCase
учебный класс, selenium
и следуя этой документации на веб-сайте Django [ссылка] ( 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']
2 ответа
Я настоятельно советую вам использовать фабрику вместо прибора JSON. Это намного более читабельно и легко поддерживать.
В приведенном вами примере мне интересно, правильно ли зашифрован пароль или нет.
Пример:
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)
не забудьте напечатать body
выяснить в чем ошибка.
Fixture является исходным набором данных для конкретной модели. Ваш тестовый пример создаст тестовую базу данных, таблицы и вставит данные в соответствии с файлом фикстуры.
Вы можете создать прибор вручную или экспортировать, используя dumpdata
команда управления. Поскольку пароли хешируются, проще создать пользователя в вашем приложении, а затем экспортировать данные таблицы в виде фиксатора:
$ 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
}
]
Чтобы проверить ваш процесс входа с проверкой селена, если 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)