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 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 看钩!assert/pytest-assume失败后截图 -> 正文阅读

[开发测试]看钩!assert/pytest-assume失败后截图

需求

在使用pytest-assume的时候,它会等待测试函数执行结束才会抛出错误,这样我们可以执行更多,在最终的时候统一查看错误。

但是在进行ui自动化测试的时候,我需要在错误出现的时候就进行截图。

现状

之前使用pytestassue进行测试脚本编写的时候,使用了pytest_runtest_makereport钩子函数就行了

通过测试执行状态判断再进行失败截图

@pytest.hookimpl(tryfirst=True,?hookwrapper=True)
def?pytest_runtest_makereport(item,?call):
????"""
????pytest?失败后执行
????:param?item:?测试用例
????:param?call:?测试步骤
????:return:
????"""
????out?=?yield
????result?=?out.get_result()
????logger.info(f"测试报告:{result}")
????logger.info(f"执行耗时:{call.duration}")
????if?result.outcome?in?['failed',?'error']:
????????for?k,?v?in?item.funcargs.items():
????????????if?hasattr(v,?'driver'):
????????????????attach_png(f'{TEST_PIC}/{int(time.time())}.png',?"失败截图",?v)
????????????????break

这个钩子传入了一个item对象,通过简单的调试就可以发现,我们需要的页面操作对象也在里面,所以我们可以方便的进行截图。

所以,理所当然的打开pytest-assume的源码看一下,有没有相关的钩子可以使用

def?pytest_assume_fail(lineno,?entry):
????"""
????Hook?to?manipulate?user-defined?data?in-case?of?assumption?failure.
????lineno:?Line?in?the?code?from?where?asumption?failed.
????entry:?The?assumption?failure?message?generated?from?assume()?call
????"""
????pass

找到了pytest_assume_fail,这下离我们失败截图这个需求,就差一步了,也就是拿到页面操作对象。

但是调试一下我们就可以发现,它给我们的两个参数linenoentry

我们写一个简单的测试脚本查看一下

import?pytest

def?test_a():
????pytest.assume(0,?"错了")

lineno:失败的行数

11

entry:失败的内容

test_1.py:11:?AssumptionFailure
>>????pytest.assume(0,?"错了1")
AssertionError:?错了1
assert?0
调试1

测试函数中页面操作对象会通过fixture的方式传入,所以在流程中它肯定是能找到的

这时就比较容易想到常用的两个方法

  • locals()

  • globals()

然而,找了一圈还是没找到页面操作的对象

这时候我在pytest-assume中发现了

(frame,?filename,?line,?funcname,?contextlist)?=?inspect.stack()[stack_level][0:5]
frame

这样,就找到了这个页面操作对象!

现在就是仿照一下这段代码了[[inspect -检查对象#使用inspect查看调用堆栈]]

import?inspect
inspect.stack()

我们查看一下效果

调试2

它会依次打印我们的执行堆栈信息

我们根据测试脚本的名字,就可以很方便的找到页面对象了!

最终效果

  1. 确定当前测试脚本位置

  2. 遍历调用堆栈列表

  3. 根据脚本名称找到对应列表索引

  4. 查看是否有页面操作对象

  5. 失败截图并跳出

def?pytest_assume_fail(lineno,?entry):
????file_name?=?os.getcwd()?+?'/test_'
????for?i?in?inspect.stack():
????????if?file_name?in?i.filename:
????????????try:
????????????????for?k,?v?in?i.frame.f_locals.items():
????????????????????if?hasattr(v,?'driver'):
????????????????????????attach_png(f'{TEST_PIC}/{int(time.time())}.png',?"失败截图",?v)
????????????????????????break
????????????except?Exception:
????????????????pass
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-09-02 11:40:46  更:2021-09-02 11:42:52 
 
开发: 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年5日历 -2024/5/11 14:05:20-

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