现在找工作黄金时间,作为一个测试,经常被面试官问到,什么是装饰器,或者你对装饰器了解多少?

 

抛出一个问题,而只会回答,装饰器是装饰函数的,通常是提升函数功能,返回一个函数。然后继续深入问问的话,就自己把自己说挂了。

 

装饰器:

装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。大多数初学者不知道在哪儿使用它们,所以我将要分享下,哪些区域里装饰器可以让你的代码更简洁。

 

在网上找资料,发现这个 https://www.runoob.com/w3cnote/python-func-decorators.html 讲python的装饰器讲的非常清楚。以下是个人的一些理解。

 

 

(1)无参数的装饰器

 

例如,我们需要打印log 和打印出这个 函数执行时间 那么就可以利用这个装饰器的功能。简洁的代码,也实现了我们的要求。

 

时间装饰器

def time_consume(function):
    """时间消耗计时器"""
    @functools.wraps(function)
    def wrapper(*args, **kwargs):
        begin_time = datetime.now()
        check = function(*args, **kwargs)
        end_time = datetime.now()
        print(end_time - begin_time)
        return check

    return wrapper


log装饰器
def logging_decorator(func):
    @wraps(func)
    def wrapped_function(*args, **kwargs):
        log_string = func.__name__ + " was called python zhuangshiqi"
        print(log_string)
        # 打开logfile,并写入内容
        with open(logfile, 'a') as opened_file:
            # 现在将日志打到指定的logfile
            opened_file.write(log_string + '\n')
        return func(*args, **kwargs)

    return wrapped_function




(2)有参数的装饰器

例如我们在做接口自动化测试的时候,需要写自动化测试用例,而最后一步就是生成测试报告和发送邮件,那么就可以使用装饰器的功能,写一个公共函数。

生成测试报告
def UI_Report(testcase,ReportPath):
    """
    根据传入的testcase 来判断执行哪种报告生成方式。
    """

    def Report(s):
        @wraps(s)
        def creat_report():
            AA = hasattr(testcase, '__call__')
            # AA = isfunction(testcase)
            if AA:
                print '这个是函数'
                suite = unittest.makeSuite(testcase)
                fp = file(ReportPath, 'wb')
                runner = HTMLTestRunner(stream=fp, title=r'UI自动化', description=r'接口自动化测试报告')
                runner.run(suite)
                fp.close()
            else:
                print '不是函数,是执行run_main方法'
                fp = file(ReportPath, 'wb')
                runner = HTMLTestRunner(stream=fp, title=r'UI自动化测试报告', description=r'商城')
                runner.run(testcase)
                fp.close()

        return creat_report

    return Report


我装饰器中增加了一个判断,那是因为,如果直接执行unitest用例的时候,是需要用到suite 测试套件  而
suite = unittest.makeSuite(testcase)  这个testcase 就是你的 类名 他实质上 是一个函数。

而 我们写了一个run_main 函数 来通过 文件名称共性来执行 多个用例文件 ,此时这个testcase 就不是一个 函数

 

 

怎么用python做实证分析_自动化测试

 

 

所以根据不同的testcase 来执行不同的报告,这里还增加了一个参数是 path 也可以写死。

 

 

 

 

有路径的log装饰器

 

def logit(logfile='out.log'):
    def logging_decorator(func):
        @wraps(func)
        def wrapped_function(*args, **kwargs):
            log_string = func.__name__ + " was called python zhuangshiqi"
            print(log_string)
            # 打开logfile,并写入内容
            with open(logfile, 'a') as opened_file:
                # 现在将日志打到指定的logfile
                opened_file.write(log_string + '\n')
            return func(*args, **kwargs)

        return wrapped_function

    return logging_decorator