Как проверить функциональность входа в систему с помощью 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']


person python    schedule 17.10.2015    source источник


Ответы (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, чтобы узнать, в чем ошибка.

person François Constant    schedule 17.10.2015
comment
Любая идея, где я ошибаюсь в этом коде: просто проверьте login_user функцию ссылка - person python; 18.10.2015
comment
Какой? В чем ошибка? Этот образец не принимает во внимание мой ответ! - person François Constant; 18.10.2015
comment
Мне просто интересно, почему функция login_user не работает в моем коде. И логин и пароль правильные. Я должен быть перенаправлен на другую страницу, но этого не происходит. - person python; 18.10.2015
comment
распечатайте body пожалуйста :) - person François Constant; 18.10.2015
comment
Эй, я пытаюсь реализовать ваш метод, и я получаю import error from factory import DjangoModelFactory, Sequence - person python; 18.10.2015
comment
pip install factory_boy -- больше информации здесь: factoryboy.readthedocs.org/en/latest - person François Constant; 18.10.2015
comment
Давайте продолжим обсуждение в чате. - person python; 18.10.2015

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)
person pista329    schedule 17.10.2015
comment
Как вы проверяете, действительны ли пользовательские данные или нет? Если он не проверен, возникает ошибка - person python; 18.10.2015
comment
Fixture содержит исходные данные для вашего теста. Но ваш вопрос касается тестового примера, позвольте мне обновить свой ответ. - person pista329; 18.10.2015
comment
Теперь я добавил приборы, мое имя пользователя и пароль верны, но все равно ничего не показывает. Вы можете просмотреть мой код здесь ‹gist.github.com/rakeshsukla53/4f3abceac47c5ca7ca41›, любые указатели где я могу ошибаться - person python; 18.10.2015
comment
Как я могу проверить ответ, который я получу от password_field.send_keys(Keys.RETURN). Я имею в виду, что когда вы нажмете Enter, вы либо будете перенаправлены, либо код состояния будет 403, верно? К сожалению, ответ password_field.send_keys(Keys.RETURN) - None :/ - person python; 18.10.2015
comment
Я не уверен, можете ли вы получить код состояния ответа из веб-драйвера селена. Selenium действует как безголовый веб-браузер. send_keys(Keys.RETURN) отправит форму. body = self.selenium.find_element_by_tag_name('body') сразу после отправки вы получите новый основной контент. Зарегистрируйте body.text, чтобы увидеть, работает ли он. - person pista329; 18.10.2015