如何使用 setUp 方法设置 Django 用户以在 Selenium 测试用例中使用?

问题描述 投票:0回答:1

我正在努力为我的代码创建 Selenium 单元测试。我有一个简单的登录表单:

<form method="POST">
    <input type="hidden" name="csrfmiddlewaretoken" value="f00b4r">
        
    <div id="div_id_username" class="form-group"> 
        <label for="id_username" class="requiredField">Callsign
            <spanclass="asteriskField">*</span> 
        </label> 
        <div> 
            <input type="text" name="username" autofocus="" maxlength="150" class="textinput textInput form-control" required="" id="id_username"> 
        </div> 
    </div> 
    <div id="div_id_password" class="form-group"> 
        <label for="id_password" class="requiredField">Password
            <span class="asteriskField">*</span> 
        </label> 
        <div> 
            <input type="password" name="password" autocomplete="current-password" class="textinput textInput form-control" required="" id="id_password"> 
        </div> 
    </div>
    <button class="btn btn-primary" type="submit">Login</button>
</form>

这是测试用例:

class TestLoginFormFirefox(LiveServerTestCase):
def setUp(self):
    self.driver = webdriver.Firefox()
    self.good_user = User.objects.create_user(username="unittest", password="this_is_unit")

def tearDown(self):
    self.driver.close()

def test_index_login_success(self):
    """
    When a user successfully logs in, a link to their profile should appear in the navbar
    """
    self.driver.get('http://127.0.0.1:8000/login')
    username_field = self.driver.find_element(by=By.ID, value='id_username')
    password_field = self.driver.find_element(by=By.ID, value='id_password')
    username_field.send_keys('unittest')
    password_field.send_keys("this_is_unit")
    login_button = self.driver.find_element(by=By.CLASS_NAME, value="btn-primary")
    login_button.send_keys(Keys.RETURN)
    # needs time to render
    sleep(3)
    id_profile_link = self.driver.find_element(by=By.ID, value='id_profile_link').text
    assert id_profile_link == 'unittest'

测试很简单:如果unittest setUp方法中指定的用户能够成功登录,则断言该用户的用户名是下一页中链接的一部分。

这里的问题是setUp方法创建了用户对象,但是登录失败。这种情况一直持续到我通过 createsuperuser 在项目数据库中创建了一个具有相同用户名和密码的用户。有没有办法为此流程创建一个有效的测试用户,而不必事先使用 createsuperuser 将其添加到项目的

auth_user
表中?

python django selenium-webdriver python-unittest
1个回答
0
投票

当您使用 Django 的测试框架运行测试时(例如使用

LiveServerTestCase
),django 会在测试期间设置一个单独的测试数据库。 该测试数据库独立于您项目的主数据库。

测试类中的

setUp
方法在此测试数据库中正确创建用户,但是如果您的 Selenium 测试针对您的主应用程序(正在使用项目的主数据库)运行,则它将无权访问创建的用户在测试数据库中。这就是为什么您的登录尝试会失败,直到您在主数据库中手动创建用户为止。

几个选项:

  • 使用 Django 的测试服务器:测试方法中的 URL

    self.driver.get('http://127.0.0.1:8000/login')
    应指向测试服务器,该服务器通常在不同的端口上运行。 Django 的
    LiveServerTestCase
    提供了
    live_server_url
    属性,它为您提供测试服务器的 URL。

    self.driver.get(self.live_server_url + '/login')
    
  • 在您的测试设置中创建一个用户并使用它

© www.soinside.com 2019 - 2024. All rights reserved.