前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >测试开发进阶(四)

测试开发进阶(四)

作者头像
zx钟
发布2019-08-16 11:20:40
4670
发布2019-08-16 11:20:40
举报
文章被收录于专栏:测试游记

闭包

代码语言:javascript
复制
def func():
    print('----func----')

    def wrapper():
        print('----wrapper----')

    return wrapper

print(func())
"""
----func----
<function func.<locals>.wrapper at 0x103bb77b8>
"""
func()()
"""
----func----
----wrapper----
"""

满足闭包的条件

  • 函数中嵌套一个函数
  • 外层函数的返回值是内层函数的函数名
  • 内层嵌套函数对外部作用域有一个非全局变量的引用

闭包的作用

  • 实现数据锁定
代码语言:javascript
复制
# 数据锁定
def func2():
    num = 1000

    def wrapper():
        print(f'这里使用了num的值{num}')

    return wrapper

wrapper = func2()
num = 10000
wrapper() # 这里使用了num的值1000

装饰器

开放封闭原则:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的

装饰器的作用:在不更改原功能函数内部代码,并且不改变调用方法的情况下为原函数添加新的功能。

@:语法糖

代码语言:javascript
复制
def decorator(num):
    def wrapper():
        print(num)

    return wrapper

decorator(1000)()
代码语言:javascript
复制
def decorator1(func):
    def wrapper():
        print(func)# 1⃣️
        func()

    return wrapper


def func():
    print('这是func')#2⃣️


wra = decorator1(func)
wra()
"""
<function func at 0x1142421e0>1⃣️
这是func2⃣️
"""

@decorator1 # 等价于func1 = decorator1(func1)
def func1():
    print('这是func')

func1()

一个作用域的错误

代码语言:javascript
复制
a = 100
def func():
    print(a)
    a = 999
func()
"""
Traceback (most recent call last):
  File "/Users/zhongxin/Desktop/py/zx/04/0812_2.py", line 14, in <module>
    func()
  File "/Users/zhongxin/Desktop/py/zx/04/0812_2.py", line 12, in func
    print(a)
UnboundLocalError: local variable 'a' referenced before assignment
"""

装饰器常见应用场景

  • 权限校验
  • 计算时间⌛️
  • 环境准备和恢复工作
  • web自动化用例失败截图

Chrome插件推荐-ChroPath

元素定位

web自动化用例失败截图
代码语言:javascript
复制
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')


def decorator(func):
    def wrapper():
        try:
            func()
        except:
            browser.save_screenshot('eroor.png')
            raise

    return wrapper


@decorator
def test_search():
    browser.find_element_by_id('kw').send_keys('selenium')
    browser.find_element_by_id('su11').click()


test_search()

截图

带参数的装饰器

代码语言:javascript
复制
def decorator(func):
    print('1')

    def wrapper(*args, **kwargs):
        print('2')
        func(*args, **kwargs)

    return wrapper


@decorator
def add_num(a, b):
    print(f'sum={a + b}')


add_num(11, 22)
"""
1
2
sum=33
"""

类实现装饰器

__call__:魔术方法,在对象使用括号调用的时候会触发

代码语言:javascript
复制
class MyDecorator(object):
    def __init__(self, func):
        self.func = func #⚠️⚠️⚠️

    def __call__(self, *args, **kwargs):
        print('这是__call__方法')
        self.func(*args, **kwargs)

    def func(self):
        print('这是MyDecorator的func方法')


@MyDecorator  # add_num = MyDecorator(add_num)
def add_num(a, b):
    print(f'sun={a + b}')


add_num(1, 2)

装饰器装饰类

代码语言:javascript
复制
def dceorator(func):
    def wrapper(*args, **kwargs):
        print('111')
        obj = func(*args, **kwargs)
        print('222')
        return obj

    return wrapper

@dceorator  # Hero = dceorator(Hero)
class Hero:
    def func(self):
        print('这是Hero的func')

h = Hero()
print(h)
h.func()
"""
111
222
<__main__.Hero object at 0x1033a4390>
这是Hero的func
"""
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 闭包
    • 满足闭包的条件
      • 闭包的作用
      • 装饰器
        • 一个作用域的错误
          • 装饰器常见应用场景
            • web自动化用例失败截图
          • 带参数的装饰器
          • 类实现装饰器
          • 装饰器装饰类
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档