IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 自定义截图装饰器与pytest-conftest同时使用遇到的问题 -> 正文阅读

[开发测试]自定义截图装饰器与pytest-conftest同时使用遇到的问题

场景/原因

使用pytest做UI自动化,driver和case_data写在了conftest中,测用例直接调用
另外写了一个装饰器,在测试用例运行完成后/报错后截图

代码如下

测试用例代码如下

from common.step_method import StepMethod
from common.public import  *

class TestCases():

    @get_screen_in_case_end_or_error
    def test_001(self,driver,case_data):
        '''
        根据传进来的参数,执行测试用例
        :param driver: 浏览器驱动
        :param case_data: 测试用例数据
        :return:
        '''
        allure.dynamic.feature(case_data["feature"])
        allure.dynamic.story(case_data["story"])
        allure.dynamic.title(case_data["case_name"])
        step_method=StepMethod(driver=driver)
        for step in case_data["case_steps"]:
            with allure.step(step["case_step"]):
                if hasattr(step_method, step["method"]):
                    func=getattr(step_method, step["method"])
                    func(**step)
                else:
                    raise Exception(f'传入的方法:{step["method"]}不正确,请检查')

装饰器代码如下

def get_screen_in_case_end_or_error(func):
    '''
    测试用例运行完成或者发生错误的时候进行截图
    :param func:
    :return:
    '''
    def f1(*args,**kwargs):
        try:
            func(*args,**kwargs)
            time.sleep(1)
            get_screen_add_report(args[0].driver,'运行完成截图')
        except:
            time.sleep(1)
            get_screen_add_report(args[0].driver,"异常截图")
            raise
    return f1

运行后报错

..\common\public.py:62 (TestCases.test_001)
args = (<test_cases.test_cases.TestCases object at 0x0000018C98FF0588>,)
kwargs = {}

    def f1(*args,**kwargs):
        try:
>           func(*args,**kwargs)
E           TypeError: test_001() missing 2 required positional arguments: 'driver' and 'case_data'

很明显,这两个写在conftest中的参数,并没有自动传进去,因为外面包了一层装饰器,导致pytest的conftest中的前置参数不能正常传进去了,经过查找,需要在装饰器中加@wraps(func)

修改装饰器

from  six  import  wraps
#截图装饰器
def get_screen_in_case_end_or_error(func):
    '''
    测试用例运行完成或者发生错误的时候进行截图
    :param func:
    :return:
    '''
    @wraps(func)
    def f1(*args,**kwargs):
        try:
            func(*args,**kwargs)
            time.sleep(1)
            get_screen_add_report(args[0].driver,'运行完成截图')
        except:
            time.sleep(1)
            get_screen_add_report(args[0].driver,"异常截图")
            raise
    return f1

运行后报另外的错误

args = (<test_cases.test_cases.TestCases object at 0x0000028BC4C9D248>,)
kwargs = {'case_data': {'case_loc': (1, 11, 1, 2), 'case_name': '成功注册', 'case_steps': [{'case_name': '成功注册', 'case_step': '打开课程...e': '公共', ...}, 'driver': <selenium.webdriver.chrome.webdriver.WebDriver (session="f4f9ad26335cc919b4a9514e839f65f9")>}

    @wraps(func)
    def f1(*args,**kwargs):
        try:
            func(*args,**kwargs)
            time.sleep(1)
>           get_screen_add_report(args[0].driver,'运行完成截图')
E           AttributeError: 'TestCases' object has no attribute 'driver'

driver是直接传给用例的,装饰器如何能用到这个driver参数呢

修改测试用例代码,把driver赋值给self.driver,在装饰器中可以用obj获取

from  six  import  wraps
#截图装饰器
def get_screen_in_case_end_or_error(func):
    '''
    测试用例运行完成或者发生错误的时候进行截图
    :param func:
    :return:
    '''
    @wraps(func)
    def f1(obj,*args,**kwargs):
        try:
            func(obj,*args,**kwargs)
            time.sleep(1)
            get_screen_add_report(obj.driver,'运行完成截图')
        except:
            time.sleep(1)
            get_screen_add_report(obj.driver,"异常截图")
            raise
    return f1

case中代码如下

from common.step_method import StepMethod
from common.public import  *

class TestCases():

    @get_screen_in_case_end_or_error
    def test_001(self,driver,case_data):
        '''
        根据传进来的参数,执行测试用例
        :param driver: 浏览器驱动
        :param case_data: 测试用例数据
        :return:
        '''
        self.driver=driver
        allure.dynamic.feature(case_data["feature"])
        allure.dynamic.story(case_data["story"])
        allure.dynamic.title(case_data["case_name"])
        step_method=StepMethod(driver=driver)
        for step in case_data["case_steps"]:
            with allure.step(step["case_step"]):
                if hasattr(step_method, step["method"]):
                    func=getattr(step_method, step["method"])
                    func(**step)
                else:
                    raise Exception(f'传入的方法:{step["method"]}不正确,请检查')

最后解决,没有报错

在这里插入图片描述

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-15 15:53:24  更:2021-08-15 15:54:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 21:27:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码