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,一经查实,立即删除!

相关文章

【Qt】Qt中的信号槽

一、信号和槽概述 信号槽是Qt矿建引以为豪的机制之一。 所谓信号槽,实际上就是观察者模式(发布——订阅模式)。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号。这种发出的信号是…

LAMP集群分布式实验报告

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

Linux 主机一键安全整改策略

为防止linux主机被恶意攻击,和受到攻击后能更快定位到源头,需要对linux主机做一些参数配置。 比如禁用root的远程登录、用户多次密码验证失败后被锁、禁止系统账号交互式登录等等。 下面是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的主要组成部分包括页面对象类、元素定位方式和操作方法…

MybatisPlus @TableField之SqlCondition源码解析

应用对象:模型,作用:调用IService接口,使用查询包装器实现灵活的条件查询。 TableField(conditionSqlCondition.LIKE) 注解使用逻辑 com.baomidou.mybatisplus.extension.service.IService.page(分页对象,查询包装器…

“区块链技术在网络安全领域的革新应用与挑战“

区块链技术,以其去中心化、不可篡改和透明度高的特性,在网络安全领域展现出了巨大的革新潜力,同时也带来了一系列新的挑战。以下是区块链技术在网络安全领域的应用及其面临的主要挑战的深入分析。 革新应用 1. 数据保护与隐私增强&#xff…

PHP身份证识别接口、线上平台如何实现身份证实名认证功能?

线上平台实现身份证实名认证的功能,需要结合身份证识别接口来完成。首先,用户通过上传身份证图片或者拍照的方式实现证件信息的提取,身份证实名认证接口通过对提取到的证件信息进行核验,以此来实现线上用户身份的实名认证&#xf…

LabVIEW车轮动平衡检测系统

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

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

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

Unity真机打包地形不显示

Using terrain.drawInstanced in a build - Shader unsupported: Hidden/Nature/Terrain/Utilities Terrain missing on build 大概是两种思路 第一是材质shader丢失,把Terrain相关的shader都添加到ProjectSetting里 第二是地形Inspector面板,把Draw …

Django配置

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

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

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

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

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

安卓手机APP开发__超宽带(UWB)通信

安卓手机APP开发__超宽带(UWB)通信 目录 概述 控制方/发起方与控制方/响应方 参数范围 后台测距 STS 配置 步骤 使用限制 代码示例 示例应用 UWB 范围 RxJava3 支持 生态系统支持 支持 UWB 的移动设备 第三方 SDK 概述 注意 :UWB 目前仅支持 Jetpac…

JavaScrpit基础入门

JavaScript 是一种用于网页开发的脚本语言,它主要用于增强网页的交互性和动态性。HTML 用于定义网页的结构,包括文本、图像、链接等内容,而 CSS 用于定义网页的样式,包括颜色、布局、字体等。JavaScript 通过与 HTML 和 CSS 结合使…

大模型中的Tokenizer

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

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

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

raspberry pi/orienge pi等arm架构硬件打包ros humble docker视觉及机器人开发镜像

raspberry pi/orienge pi等arm架构硬件打包ros humble docker开发镜像 文章目录 前言准备工作拉取镜像编写Dockerfile编译docker镜像启动镜像docker-compose文件编写总结前言 这篇文章主要用于定制化打包需要的docker镜像,由于ros1提供的镜像源是国外的很多软件无法更新,所以…

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

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