这是我的用例之一,我想给每个用例都加入异常捕捉和保存截图。
目前想的方法就是在每条用例里直接加上 try,后面加上 except
但是这种每条用例都需要,并且还相同的代码,有没有什么办法可以把它抽像出来?
请教下各位大佬。
用函数装饰器就可以了
写个异常装饰器装饰好了
import functools
# 捕获异常装饰器
def exception_log(func):
functools.wraps(func)
def wrapper(*args, **kwargs):
cls = args[0]
try:
return func(*args, **kwargs)
except Exception as e:
func_name = func.__doc__
# func_params = dict(args=args, kwargs=kwargs)
log_msg = f"{func_name}失败: {str(e)}"
cls.log.error(log_msg)
raise Exception(log_msg)
return wrapper
你要的是 tearDown 里判断测试失败,并做相关现场的保存
想给每个用例都加入异常捕捉和保存截图
做段时间就会发现,加了这个作用不大。
加个全局的 teardown,里面实现截图保存
你想太多了, 压根不需要考虑异常捕捉,不然干嘛用 unittest 单元测试框架。自己直接写代码做测试不就好了。
之所以用测试框架,说明这些事情都框架都给我们做了。当用例错误/失败,框架自动抛出异常,并且不影响下一条用例的执行。 并且最终帮你统计成功/失败/错误的用例数。 自己写异常捕捉没啥意义。
如果是想在用例失败的时候截图,那么需要 和 测试报告结合,不然截图放某个目录下面也好找和用例的对应关系。
推荐 XTestRunner,自动截图:https://github.com/SeldomQA/XTestRunner/blob/master/docs/test_type.md
你应该是想要个异常报错进行截图保存的装饰器
import functools
import inspect
def screen(target=None, func_prefix="test"):
def decorator(func_or_cls):
if inspect.isfunction(func_or_cls):
@functools.wraps(func_or_cls)
def wrapper(*args, **kwargs):
try:
return func_or_cls(*args, **kwargs)
except Exception: # 可以修改要捕获的异常类型
args[0].driver.save_screenshot('./screenshot/' + str(args[0]) + ".png") # args[0].driver对应测试类中的driver
raise
return wrapper
elif inspect.isclass(func_or_cls):
for name, func in list(func_or_cls.__dict__.items()):
if inspect.isfunction(func) and name.startswith(func_prefix):
setattr(func_or_cls, name, decorator(func))
return func_or_cls
else:
raise AttributeError
if target:
return decorator(target)
else:
return decorator
from common.screen import screen
@screen
def testCase01(self):