如何在 Django 中使用 LiveServerTestCase 和 Selenium 测试登录功能

How to test login functionality using LiveServerTestCase and Selenium in Django

我正在为一个项目编写测试用例,想测试我的登录功能。我正在使用 LiveServerTestCase class、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']

是什么意思

夹具是特定模型的初始数据集。您的测试用例将创建测试数据库 tables,并根据夹具文件插入数据。

您可以手动创建夹具或使用 dumpdata 管理命令导出。由于密码经过哈希处理,因此更容易在您的应用程序中创建用户,然后将 table 数据导出为 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_sha256000$sDvLgitB2ieq$tGnZ4Vw+BVOnluucn0GyLzi1tV1dZEg=",
  },
  "model": "auth.user",
  "pk": 1
}
]

如果 body.text 在提交登录表单后包含特定文本:

,则使用 selenium 检查测试您的登录过程
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)

我强烈建议您使用工厂而不是 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 以查明错误是什么。