Python装饰器的实际应用场景与自动化测试示例
本文详解Python装饰器在工程中的实际应用,重点展示如何在自动化测试中通过自定义装饰器统一输出用例执行耗时。同时介绍其在身份认证、输入校验及缓存等开发场景中的用法,帮助测试与开发人员理解装饰器如何在不修改原代码的前提下扩展功能。
Python装饰器在自动化测试中的耗时统计应用
接上一篇
既然已经弄清楚了Python装饰器的基本原理,那么在实际工作中它究竟能发挥什么作用呢?尤其对于像我这样主要编写脚本而非从事Python核心开发的测试人员来说,了解这一点尤为重要。
结论先行:装饰器在实际工作中确实非常有用。
一、在自动化测试中的应用
以常见的自动化测试场景为例,如果我们希望统一输出某些信息,例如每个用例的运行时长或用例名称等,就可以利用装饰器来实现。
首先,让我们看一个最简单的测试用例,这里没有使用装饰器:
import pytest
def test_01():
a = 1
b = 2
assert a < b
def test_02():
a = 1
b = 1
assert a-b == 0
if __name__ == '__main__':
pytest.main(['demo_test.py'])
该测试文件中包含2个用例,运行结果如下:
============================= test session starts ============================= platform win32 -- Python 3.8.5, pytest-6.0.1, py-1.9.0, pluggy-0.13.1 rootdir: D:\练习 collected 2 items
demo_test.py .. [100%]
============================== 2 passed in 0.01s ============================== [Finished in 0.4s]
运行通过时显示为点号(.),因此上述结果显示有2个点,代表2个用例全部通过。
如果希望在运行结果中看到每个用例的具体执行时长,可以编写一个装饰器来处理:
import pytest
import functools
import time
def log_execute_time(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
res = func(*args, **kwargs)
end = time.perf_counter()
print("{} 用时 {} ms".format(func.__name__, (end - start) * 1000))
return res
return wrapper
@log_execute_time
def test_01():
a = 1
b = 2
assert a < b
@log_execute_time
def test_02():
a = 1
b = 1
assert a-b == 0
if __name__ == '__main__':
pytest.main(['-s','demo_test.py'])
运行该代码后,结果如下:
============================= test session starts ============================= platform win32 -- Python 3.8.5, pytest-6.0.1, py-1.9.0, pluggy-0.13.1 rootdir: D:\练习 collected 2 items
demo_test.py test_01 用时 0.0007999999999674934 ms . test_02 用时 0.0012999999999818712 ms .
============================== 2 passed in 0.03s ============================== [Finished in 0.4s]
从输出可以看到,每个用例执行时都会打印出对应的耗时信息。
上述示例展示了自动化测试中的具体应用场景,实际使用中还需根据具体需求进一步挖掘装饰器的潜力。
Python装饰器在开发中的身份认证与其他场景
二、其他Python开发场景的用法
经过查阅,装饰器在Python开发中还有多种用途,其中大家比较熟悉的是“身份认证”。
例如在博客园等平台上,未登录账号可以浏览内容,但当尝试评论或发文时,系统会提示需要登录。这种场景就可以利用装饰器来实现。代码示例如下:
import functools
def authenticate(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
request = args[0]
if check_user_logged_in(request): # 检查用户是否登录
return func(*args, **kwargs) # 如果登录了,就可以执行函数post_comment() 发送评论
else:
raise Exception('Authentication failed') # 否则,身份验证失败
return wrapper
@authenticate
def post_comment(request)
pass
上述代码仅用于说明该机制,辅助描述具体场景。
此外,装饰器还可用于输入合理性检查、缓存等多个场景。由于本文侧重测试视角,此处不再深入展开开发细节。
装饰器核心概念总结
三、装饰器小结
装饰器本质上是一个Python函数或类,它允许其他函数或类在不修改原有代码的前提下增加额外功能。装饰器的返回值也是一个函数对象或类对象。
使用装饰器,我们可以将大量与函数核心功能无关的重复代码抽离出来,放入装饰器中并重用。这让人联想到面向切面编程(AOP)的思想。
如果您还知道其他应用场景,欢迎留言补充。
以上就是Python装饰器实际作用的详细内容,更多关于Python装饰器作用的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









