Selenium unittest 中每条用例都有的 try except 部分能否抽像出来?

狂天 · 2022年03月25日 · 最后由 homin 回复于 2022年03月31日 · 2863 次阅读

这是我的用例之一,我想给每个用例都加入异常捕捉和保存截图。

目前想的方法就是在每条用例里直接加上 try,后面加上 except

但是这种每条用例都需要,并且还相同的代码,有没有什么办法可以把它抽像出来?
请教下各位大佬。

共收到 7 条回复 时间 点赞

用函数装饰器就可以了

写个异常装饰器装饰好了

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):
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册