web自动化-数据驱动与失败用例截图、失败重新运行

因为只有失败的用例需要截图,那么问题就是: 什么时候用例会失败?

数据驱动测试

我们前面覆盖到的用例都是正常的用例,如果要测试异常的用例呢? 我们来写一下登录的异常 场景:【login_page】

# 用户输入框错误提示
#username_error_tips = (By.XPATH,'//div[text()="账号为4~16位字母、数字或下划
线"]')
# 密码输入框错误提示
#password_error_tips = (By.XPATH,'//div[text()="请输入密码"]')

但是这样两种不同的定位表达式去断言就不方便了,我们希望不管是什么的异常,都可以直接 调用一个方法可以实现;所以我们封装一下方法,统一处理输入框异常的提示断言:

  • 都是text= 某个文本,只是文本不一样,所以我们可以把文本参数化一下。到时候用例里是 什么文本,我们就传进去,确认是否存在现实-用is_display方法就可以:
    # 统一处理输入框异常提示断言def is_error_tips_display(self, tips_text):locator = (By.XPATH, f'//div[text()="{tips_text}"]')return self.elememnt_display(locator)

    添加一个测试方法运行异常的登录用例:

    def test_login_failure(open_close_broswer):driver = open_close_broswerHomePage(driver).click_login_link()LoginPage(driver).login("", "lemon123456")# 拿到登录失败提示 后断言assert_condition(LoginPage(driver).is_error_tips_display("账号为4~16位
    字母、数字或下划线"))

    但是我们异常的用例肯定不止这一条,比如登录失败的用例:

  • 用户名过长: 提示错误

  • 用户名过短: 提示错误

  • 用户名为空,提示错误

  • 密码为空,提示错误 等

像这种,输入数据不一样,而导致结果提示不一样来判断,我们可以用什么来执行?--pytest的数据驱动实现。

#字典列表保存登录异常数据
cases_all = [{'username':'','password':'lemon123456','expected':'账号为
4~16位字母、数字或下划线'},{'username':'lemonlemonlemon11','password':'lemon123456','expected':'账
号为4~16位字母、数字或下划线'},{'username':'lem','password':'lemon123456','expected':'账号
为4~16位字母、数字或下划线'},{'username': 'lemon_auto', 'password': '', 'expected': '请输
入密码'}]
@pytest.mark.parametrize('case', cases_all)
def test_login_fail(open_close_broswer, case):driver = open_close_broswerHomePage(driver).click_login_link()LoginPage(driver).login(case['username'], case['password'])# 拿到登录失败提示 后断言assert_condition(LoginPage(driver).is_error_tips_display(case['expected']))

但是如果元素定位的方法跟上面的不一样,能加入一起做数据驱动么? 比如 账号密码错误提 示。

  • 不可以,因为方法不一样,不符合数据驱动的原则。数据驱动就是要方法一样 数据不一 样 结果不一样。方法不一样 就不可以数据驱动。

UI自动化测试里数据驱动用的比较少,只有当这种情况才可以做:

  • 1、操作步骤是一致的;不同的输入数据 页面不切换,只是提示错误信息不一样 可以用数 据驱动;如果发生了页面的切换,那么元素定位的步骤又变化了,这种就不太适合数据驱 动了。
  • 2、断言也是一致的,不需要切换页面和另外做元素定位。
    • 所以当用户名密码错误 的提示 这种就不能用数据驱动了,因为元素定位的方式不 一致。要做单独写一条用例去实现
    • 像上面账号密码错误用例要测试就需要单独写一条测试用例执行这个场景的用例。

数据驱动的使用场景总结:

  • 1、数据驱动测试在接口自动化测试里用的更多: 一个方法 数据不一样 获取结果做不同的断言 就可以实现; 
  • 2、UI 自动化测试因为每个用例的步骤和断言的预期结果差异很大,所以一般UI 自动化一般都 不太适合做数据驱动,数据驱动在UI自动化用的比较少;
    • 所以 UI自动化测试 在更多的时候,不会做全用例覆盖,只会做冒烟测试覆 盖,跑正常的用例,或者做基本的配置测试。

自动化的测试数据管理:

  • 1、接口自动化那样具有规则,每个接口的数据都是地址+头部+参数等固定的字段,断言 的方法也可以固定;所以,数据放在excel统一管理,统一读取,统一操作可行性较高;
  • 2、UI自动化测试的测试数据会不会放在外部文件【excel】存放,因为不像接口自动化那 样具有规则,UI的用户名 商品 订单名字啥的没有规则;所以会直接放在py文件脚本里进 行维护管理。

失败用例的截图

UI自动化测试,在用例执行失败时,我们想要更加直观的获取现场的有效信息,通过截图是一 种有效的方式。

  • 因为有界面的测试,有截图是更加直观的。
  • 不需要把每一条用例都截图,只有失败的用例需要定位问题的时候,会去截图;跟我们报 bug一样,失败了截图给开发看。

Seleinum中使用截图有四种方法:我们用第一种和第二种比较多。

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 第一种方法: 直接截图保存在本地,传递一个参数:png的图片
driver.save_screenshot("test.png")
# 第二种方法: 将截图保存为本地文件, 后缀都是png的格式 跟上面的方法效果一样的
driver.get_screenshot_as_file("t1.png")
# 第三种方法: 将截图返回为二进制数据 不需要传参 -- 用的不多
print(driver.get_screenshot_as_png())
# 第四种方法: 将截图返回为base64编码的数据 不需要传参 -- 用的不多
print(driver.get_screenshot_as_base64())
driver.close()

因为只有失败的用例需要截图,那么问题就是: 什么时候用例会失败?

  • 参考我们之前的异常捕获: 之前加了异常捕获的位置基本上都会容易发生异常的和失败 的。
  • 所以之前加上异常不会的地方,都可有加上截图。 失败了 直接在根目录 存储一个图片
    class BasePage:def __init__(self, driver):"""初始化函数,定义driver为实例属性后面的方法要用就不需要定义参数了,直接调用实例属性即可。"""self.driver = driverdef wait_element_clickable(self, locator):logger.info(f"等待元素{locator}可以点击")try:web_element=WebDriverWait(self.driver,8,0.5).until(EC.element_to_be_clickable(locator))except Exception as e:logger.error(f"等待元素超时{e}")self.driver.save_screenshot("test.png") # 异常了 就截图raise ereturn web_elementdef wait_element_visible(self, locator):# web_element代表通过显示等待找到的元素logger.info(f"等待元素{locator}可见")try:web_element = WebDriverWait(self.driver, 8,
    0.5).until(EC.visibility_of_element_located(locator))except Exception as e:logger.error(f"等待元素可见异常了{e}")self.driver.save_screenshot("test.png") # 异常了 就截图raise ereturn web_element

    但是这样做有一个问题: 每个图片的名字一样的,会被覆盖掉。所以要每个名字都独立不一样 的

  • 可以用时间戳区分别,ms级别的时间戳

    import time
    print(int(time.time() * 1000))
    timestamp = f"screenshop_{int(time.time() * 1000)}.png" # 拼接出来图片的名
    字 每次都是不一样的
    print(timestamp)

    还有断言失败 也是要截图的: 所有断言的方法里也要加上截图代码: 但是断言方法里没有driver,可以把driver定义为参数,到时候用例执行的时候存入这个参数。 每一个模块的用例调用断言的方法的时候就加一个driver的参数。

    def assert_equals(driver,actual, excepted):try:assert actual == exceptedlogger.info(f'断言成功,预期结果:【{excepted}】,实际结果:【{actual}】')except Exception as e:logger.error(f'断言失败,预期结果:【{excepted}】,实际结果:【{actual}】')driver.save_screenshot(f"screenshop_{int(time.time() *1000)}.png") # 异常了 就截图raise e
    

    截图都成功了,但是都在根目录下,所以我们希望放在outputs下的单独建一个文件夹目录存 放: screenshot,在路径处理方法里加上截图文件夹的路径处理。

截图和allure报告结合 这样写的截图在框架本地,用例比较多,截图也 比较多,通过时间戳找图片也不太直观和方便,我们想要把截图和用例关联起 来,并体现在测试报告里,目前测试报告里有么?

如果想要把失败截图跟用例关联,附上allure测试报告里,怎么办呢?

  • 用allure 的附件功能加上就可以。allure.attach()
  • allure.attach()把传进去的数据作为allure 的报告的附件添加进去;
  • allure的 attch这个方法不能用本地的图片存储传参数进去,接收的是二进 制格式的数据,所以截图需要用 driver.get_screenshot_as_png() 这个方 法,返回结果是二进制数据。
  • attach方法可以传几个参数:body, name=None, attachment_type=None
    • 1、body:图片的二进制数据: driver.get_screenshot_as_png()
    • 2、name:附件图片取个名字:
    • 3、attachment_type:附件的类型 可以是png bmp等
  • 这样完成后,本地就不会有截图,会在allure文件下产生png的图片,然后 在allure 报告里页面还会展示对应的图片。
  • 注意:要用run运行才会产生allure报告

思考: 接口自动化测试需要失败的截图么?

  • 不需要,接口都没有截图,只有有界面的测试 才需要截图。 【WebUI,APP测试】

失败了重运行(了解)

像UI自动化测试因为不太稳定,很容易失败,所以有同学总是想要失败后重运 行一下用例。

我们的pytest框架是支持失败重运行的功能的:

  • 1、安装与pytest集成的插件:pip install pytest-rerunfailures
  • 2、在运行的命令里加一个参数:
    pytest --reruns 重试次数 (--reruns-delay 次数之间间隔)
    pytest --reruns 2 运行失败的用例可以执行2次
    pytest --reruns 2 --reruns-delay 5 运行失败的用例可以执行2次,每次间隔5秒
    pytest.main([ "-s" , "-v" , "--clean-alluredir" ,f"--alluredir=
    {report_path}" , "-m p0" , "--reruns" , "2" , "--reruns-delay" , "5" ])

    遇到失败的用例,就会自动化重新运行两次。如果重运行通过了 最终的测试报 告里就不会显示失败。

不过失败重运行在工作里不太建议使用:

因为:这实际上是在隐藏问题,而不是暴露问题。测试人员应该关注爆红,而 不是绿色的通过信息, 通过重运行机制,原来产生红色警示的 10几个用例都无 一例外的通过了, 你还会花精力去分析这 10 几个用例失败可能出现的原因 吗?

万一当时确实是在异常的条件下,真的触发了这些用例爆红, 后面因为条件回 复正常,才执行成功呢?如果这种异常条件总是间歇性的出现呢?在这种情况 下,用例重运行隐藏了可能出现的 bug。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/18633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LAMP集群分布式实验报告

前景: 1.技术成熟度和稳定性: LAMP架构(Linux、Apache、MySQL、PHP)自1998年提出以来,经过长时间的发展和完善,已经成为非常成熟和稳定的Web开发平台。其中,Linux操作系统因其高度的灵活性和稳…

【XR806开发板试用】基础篇,从零开始搭建一个LCD彩屏时钟(ST7735S驱动)

本文从搭建环境开始,step by step教大家使用XR806实现驱动SPI屏幕(ST7735S驱动),并连接WiFi实现ntp对时,最终实现把时间显示到屏幕上。 #1. 搭建开发环境 1. 安装编译环境所需的依赖包 基于ubuntu 20.04,按…

UI自动化测试最佳设计模式POM

当使用Selenium进行UI自动化测试时,Page Object Model(POM)是一种最佳实践的设计模式。POM的核心思想是通过将页面封装成对象,使得测试代码更加清晰、可维护和可重用。 POM的主要组成部分包括页面对象类、元素定位方式和操作方法…

LabVIEW车轮动平衡检测系统

LabVIEW车轮动平衡检测系统 随着汽车行业的快速发展,车轮动平衡问题对乘坐舒适性、操控稳定性及安全性的影响日益凸显,成为了提高汽车性能的一个关键环节。传统的检测系统因精度低、成本高、操作复杂等问题,难以满足现代汽车行业的需求。开发…

行车安全:UWB模块的智能化在车辆安全系统中的作用

随着交通车辆数量的不断增加和道路交通拥堵的加剧,车辆安全问题日益引起人们的关注。在这种背景下,超宽带(UWB)技术作为一种新兴的定位技术,正逐渐应用于车辆安全系统中,为提高车辆行车安全性提供了新的解决…

Django配置

后端开发: python 解释器、 pycharm 社区版、 navicate 、 mysql(phpstudy) 前段开发: vs code 、 google 浏览器 django 项目配置 配置项目启动方式 创建模型 创建一个应用 在应用中创建模型类 根据模型类生成数据表 创建应用 创建模型类 …

智能除螨—wtn6040-8s语音芯片方案引领除螨仪新时代

语音螨仪开发背景: 随着物联网技术的快速发展,除螨仪作为家庭清洁的重要工具,其智能化、人性化的设计成为提升市场竞争力的关键。置入语音芯片的除螨仪,通过开机提示、工作状态反馈、操作指引、故障提醒等内容。用户可以更加直观…

邦注科技三机一体除湿干燥机在工业中的应用

三机一体除湿干燥机在工业中的应用广泛且重要,其结合了传统除湿机、冷凝器和加热器的功能,具有节能、环保、方便等特点。以下是关于三机一体除湿干燥机在工业中应用的详细解析: 一、应用领域 电子制造行业:在半导体、集成电路和…

大模型中的Tokenizer

在使用GPT 、BERT模型输入词语常常会先进行tokenize 。 tokenize的目标是把输入的文本流,切分成一个个子串,每个子串相对有完整的语义,便于学习embedding表达和后续模型的使用。 一、粒度 三种粒度:word/subword/char word词&a…

【云原生】Kubernetes----POD调度策略

目录 引言 一、Pod调度策略 (一)基本概述 (二)调度原则 (三)Predicate常见算法 (四)优先级排序 (五)调度过程 1.过滤阶段 2.优先级排序 3.选择最优…

大模型部署推理应用技术浅析

大模型完成预训练后不是就万事大吉了,离推理应用还有很大距离,需要经过微调、部署等一系列工程化工作。尤其是在2B的行业大模型应用中,为解决大模型的幻觉、时效性和推理成本问题,需要建立单一模型之上的体系。模型部署中的技术大…

Windows找出权限维持的后门

Windows权限维持主要包含活动隐藏、自启动等技术。 隐藏文件 利用文件属性 最简单的一种隐藏文件的方式,文件右键属性,勾选隐藏,点击确定后,在这个文件里看不到刚刚的文件了。 如果要让文件显示出来,就点击查看&…

matplotlib ---词云图

词云图是一种直观的方式来展示文本数据,可以体现出一个文本中词频的使用情况,有利于文本分析,通过词频可以抓住一篇文章的重点 本文通过处理一篇关于分析影响洋流流向的文章,分析影响洋流流向的主要因素都有哪些 文本在文末结尾 …

着色器技术在AI去衣中的魔法般的作用

引言: 在数字图像处理的世界中,AI去衣技术正逐步成为研究的前沿。它利用人工智能的强大能力,实现对图像中衣物的智能识别与处理。在这一过程中,着色器(Shader)技术扮演了至关重要的角色。本文将深入探讨着色…

【VTKExamples::Utilities】第十五期 ShepardMethod

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ShepardMethod,并解析接口vtkShepardMethod,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ…

没有可用软件包 docker-ce。 错误:无须任何处理

特么的各种百度查看,全是一些废话!!!centos7安装不上docker,都是老的代码了: yum install docker-ce 解决方案: # CentOS yum install docker-io

深度学习之CNN卷积神经网络

一.卷积神经网络 1. 导入资源包 import numpy as np import pandas as pd import matplotlib.pyplot as plt import sklearn import tensorflow as tf from tensorflow import keras注:from tensorflow import keras:从TensorFlow库中导入Keras模块&am…

【Unity之FGUI】白仙章Fairy GUI控件详解二

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:就业…

《征服数据结构》双向链表

摘要: 1,双链表的介绍 2,双链表的用途 3,双链表的节点插入和删除 1,双链表的介绍 前面我们讲过单链表,单链表的特点就是只能往后访问不能往前访问。单链表一般在面试中用的比较多,比如删除倒数第…

广东商标协会批复为世界酒中国菜的指导单位

广东商标协会批复荐酒师公司成为“世界酒中国菜”活动指导单位 一、批复背景与意义 广东商标协会正式批复荐酒师国际认证(广州)有限公司,成为备受瞩目的“世界酒中国菜”系列活动的指导单位。该活动旨在共建“一带一路”倡议、助力“乡村振兴…