第20章 测试固件和一个显示等待装饰器
20.1 事先创建好会话,跳过登录过程
邮件登录成功后注册cookie.用户ID存储在django.contrib.auth.SESSION_KEY
functional_tests/test_mylists.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Author : Marvin King
# Date : 2019-03-01
from django.conf import settings
from django.contrib.auth import BACKEND_SESSION_KEY, SESSION_KEY, get_user_model
from django.contrib.sessions.backends.db import SessionStore
from .base import FunctionalTest
User = get_user_model()
class MyListsTest(FunctionalTest):
def create_pre_authenticated_session(self, email):
user = User.objects.create(email=email)
session = SessionStore()
session[SESSION_KEY] = user.pk
session[BACKEND_SESSION_KEY] = settings.AUTHENTICATION_BACKENDS[0]
session.save()
##先访问网站以便设定cookie
##而404页面是加载最快的
self.browser.get(self.live_server_url + "/404_no_such_url/")
self.browser.add_cookie(dict(
name=settings.SESSION_COOKIE_NAME,
value=session.session_key,
path='/',
))
functional_tests/base.py
def wait_to_be_logged_in(self,email):
self.wait_for(
lambda :self.browser.find_element_by_link_text('Logout')
)
navbar = self.browser.find_element_by_css_selector('.navbar')
self.assertIn(email,navbar.text)
def wait_to_be_logged_out(self,email):
self.wait_for(
lambda :self.browser.find_element_by_name('email')
)
navbar = self.browser.find_element_by_css_selector('.navbar')
self.assertNotIn(email,navbar.text)
functional_tests/test_login.py
# 她点击了链接
self.browser.get(url)
# 她登录了!
self.wait_to_be_logged_in(email=TEST_EMAiL)
#她现在要退出
self.browser.find_element_by_link_text('Logout').click()
#她退出了
self.wait_to_be_logged_out(email=TEST_EMAiL)
python manage.py test functional_tests.test_login
Ran 1 test in 4.820s
OK
functional_tests/test_mylists.py
def test_logged_in_users_lists_are_savaed_as_my_lists(self):
email = 'joey@example.com'
self.browser.get((self.live_server_url))
self.wait_to_be_logged_out(email)
#乔伊是已登录用户
self.create_pre_authenticated_session(email)
self.browser.get(self.live_server_url)
self.wait_to_be_logged_in((email))
python manage.py test functional_tests.test_mylists
Ran 1 test in 9.715s
OK
git add functional_tests
git commit -m 'test_mylists:precreate sessions, move login checks into base'
20.2 显示等待辅助方法最终版:wait装饰器
用装饰器wait替代wait_for_row_in_list_table中的等待-重试-超时逻辑
functional_tests/base.py
def wait(fn):
def modified_fn(*args,**kwargs):
start_time = time.time()
while True:
try:
return fn(*args,**kwargs)
except (AssertionError,WebDriverException) as e:
if time.time() - start_time > MAX_WAIT:
raise e
time.sleep(0.5)
return modified_fn
@wait
def wait_for_row_in_list_table(self, row_text):
table = self.browser.find_element_by_id('id_list_table')
rows = table.find_elements_by_tag_name('tr')
self.assertIn(row_text, [row.text for row in rows])
@wait
def wait_for(self, fn):
return fn()
@wait
def wait_to_be_logged_in(self, email):
self.browser.find_element_by_link_text('Logout')
navbar = self.browser.find_element_by_css_selector('.navbar')
self.assertIn(email, navbar.text)
@wait
def wait_to_be_logged_out(self, email):
self.browser.find_element_by_name('email')
navbar = self.browser.find_element_by_css_selector('.navbar')
self.assertNotIn(email, navbar.text)
python manage.py test functional_tests.test_mylists
Ran 1 test in 15.860s
OK