我正在努力为我的代码创建 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
表中?
当您使用 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')
在您的测试设置中创建一个用户并使用它