测试驱动开发(Django)20

第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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值