UI自动化测试重点思考(下)--装饰器/生成器/夹具的使用/描述符的作用/ddt驱动/多线程

news2024/10/6 1:39:54

UI自动化测试重点思考--装饰器

  • 装饰器
    • 装饰器定义
    • 装饰器代码示例
    • 装饰器的执行
    • 如何将装饰器融合到pytest框架里面
  • 生成器
    • 创建生成器
    • 生成器的定义
    • 如何将生成器融合到pytest框架里面
  • fixture(夹具)使用
    • pytest fixture 中 scope 参数的详细解释
  • 描述符的总结
    • 描述符的定义
    • 描述符的作用
  • ddt数据驱动
    • 简单示例
    • 升级示例
  • 多线程
    • 安装pytest-xdist 插件
    • 采用多线程编程

装饰器

装饰器定义

装饰器是一个函数A,函数A的传参是函数B,且函数A内部还有一个函数C,且函数A返回一个函数C,函数C是包含函数B的。

装饰器代码示例

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

在这个例子中,my_decorator 是一个装饰器函数,它接受一个函数作为参数。wrapper 函数是由装饰器内部定义的一个新函数,它包裹了原始的 say_hello 函数,并添加了额外的功能。当调用 say_hello() 时,实际上是调用了 wrapper 函数,从而触发了装饰器中定义的操作。

装饰器的执行

在这里插入图片描述

  1. 当 Python 解释器执行到 @my_decorator 时,它会立即将被装饰的函数 say_hello 传递给 my_decorator 函数,相当于执行了 say_hello = my_decorator(say_hello)
  2. 在 my_decorator 函数内部,它定义了一个内部函数 wrapper,该函数包含了在被装饰函数调用前后需要执行的逻辑。
  3. 当调用 say_hello() 时,实际上是调用了 wrapper() 函数,因为 say_hello 已经被重新指向了 wrapper 函数。
  4. 在 wrapper 函数内部,首先会执行装饰器定义的前置逻辑,然后调用被装饰的函数 func(),即调用原始的 say_hello 函数。
  5. 在调用完被装饰函数后,继续执行 wrapper 函数中的后置逻辑

如何将装饰器融合到pytest框架里面

1.全局管理 driver,运行测试用例的时候先调用 driver 传入测试用例中,测试用例就可以使用 driver来操作浏览器了。
2.实现执行测试用例之前先登录或者先打开网址,执行测试用例之后再自动登出的操作。

生成器

创建生成器

  • 生成器推导式
gen = (x ** 2 for x in range(1, 6))
  • 含有yield关键字
def squares(n):
    for i in range(1, n + 1):
        yield i ** 2
    	print("这里被挤出了一个糖")
gen=squares(5)

定义了一个名为 squares 的函数,该函数接受一个整数 n 作为参数。在函数内部,使用 yield 语句来生成从 1 到 n 的整数的平方值,并在最后打印一条信息 “这里被挤出了一个糖”。

生成器的定义

1.只要是实现了yield关键字的函数都是一个生成器
2.生成器的特点是,当调用者执行到yield就会卡住,然后把yield后面的参数返回给调用者
3.当接收到next()函数的命令的时候才会执行yield关键字下面的代码

如何将生成器融合到pytest框架里面

1.自动登录登出中要使用生成器
实现了执行测试用例之前先执行前置操作【登录】【因为有装饰器】直到代码运行到有 yield 关键字的时候才会卡住,当执行完测试用例之后,pytest 自动调用 next 函数,才会去执行 yield 关键字后的后置操作【登出】。

fixture(夹具)使用

pytest fixture 中 scope 参数的详细解释

Scope 参数值描述
function每个测试函数都会调用一次 fixture 函数,并且在测试函数执行完毕后立即销毁。
class在测试类中的所有测试方法之间共享 fixture,fixture 在第一个测试方法运行前创建,在最后一个测试方法运行后销毁。
module在整个测试模块中共享 fixture,fixture 在第一个测试函数运行前创建,在最后一个测试函数运行后销毁。
session在整个 pytest 会话期间共享 fixture,fixture 在 pytest 启动时创建,在 pytest 结束时销毁。

描述符的总结

描述符的定义

描述符是实现了特定协议的类,它至少包含 get()、set() 和 delete() 中的一个方法。

描述符的作用

描述符可以用于控制对类的属性的访问、修改和删除,允许你在属性被访问、修改或删除时执行自定义的逻辑。

在这里插入图片描述

class PageElement:
    def __get__(self, instance, owner):
        print("Getting the value")
        return instance.__dict__.get(self.attr_name, None)

    def __set__(self, instance, value):
        print("Setting the value")
        instance.__dict__[self.attr_name] = value

    def __delete__(self, instance):
        print("Deleting the value")
        del instance.__dict__[self.attr_name]

class Page:
    element = PageElement()

    def __init__(self):
        self.element = None

    @property
    def element(self):
        return self._element

    @element.setter
    def element(self, value):
        self._element = value

# 示例用法
page = Page()
page.element = "Hello"  # 设置属性值,调用 PageElement.__set__()
print(page.element)     # 获取属性值,调用 PageElement.__get__()
del page.element        # 删除属性值,调用 PageElement.__delete__()

ddt数据驱动

简单示例

import pytest
import time

@pytest.mark.smoke
@pytest.mark.parametrize('username, password', [
    ('user1', 'DasSWOLd'),
    ('user2', 'pass2'),
    ('wzz', '12345')
])
def test_001(self, drivers, username, password):
    zhufeng = ZhuifengIndexPage(drivers)
    zhufeng.input_account(username)
    zhufeng.input_password(password)
    zhufeng.click_login_button()
    time.sleep(3)
  1. @pytest.mark.smoke:是一个 pytest 的标记,用于标记测试用例为 smoke 测试,表示这是一个简单的冒烟测试,主要验证系统的基本功能。
  2. @pytest.mark.parametrize(‘username, password’, […]):是 pytest 提供的一个装饰器,用于为测试用例提供多组参数数据。
  3. 测试用例 test_001(self, drivers, username, password):这是一个测试方法,其参数包括 drivers、usernausername 和 password 是测试数据,由 @pytest.mark.parametrize 提供。me 和 password。
    在这里插入图片描述

升级示例

def read_csv_file(file_path):
    """生成器方式去读取csv里面的数据来做数据驱动测试,yield关键字来控制一行一行的读取字典里面的内容(字典里面的数据是隐形的,还未产生,就和奶糖盒子一样的道理)"""
    with open(file_path, 'r', newline='') as file:
        reader = csv.DictReader(file)  # 这是一个迭代器对象,把每次读取出来的数据都放到字典里面存起来,下面用一个for循环一次一次的去读取字典里面的数据,确保不会一次性将所有的数据读取到内存中。
        for row in reader:  # 如过下面没有生成器,那么这里直接全部数据都遍历一遍,如果有生成器就会卡住,一个一个来,接收到next方法才会读取下一行。
            yield row['username'], row['password']


@pytest.mark.smoke
@pytest.mark.parametrize('username, password', read_csv_file(r'data/data.csv'))
def test_001(drivers, username, password):
    zhufeng = zhuifeng_index_page(drivers)
    zhufeng.input_account = username
    zhufeng.input_password = password
    # zhufeng.log_in_button.click()
    zhufeng.click_log_in_button
    # assert drivers.current_url == 'https://exam.wzzz.fun'

1.read_csv_file 函数:

  • 这是一个生成器函数,用于逐行读取 CSV 文件中的数据。使用 yield
    关键字,每次从文件中读取一行数据,并返回一个包含用户名和密码的元组。
  1. @pytest.mark.parametrize(‘username, password’, read_csv_file(r’data/data.csv’)):
  • 使用 @pytest.mark.parametrize 装饰器标记测试用例,并提供了多组用户名和密码的数据源。
  • 数据源来自于 read_csv_file 函数返回的生成器,通过调用 read_csv_file 函数来读取 CSV文件中的数据,并将其作为参数传递给测试用例。
    3.def test_001(drivers, username, password):
  • 在测试方法中,首先创建了一个 zhufeng_index_page 对象,然后输入了用户名和密码,并点击了登录按钮(注释掉的部分)
  • 这个测试方法会被 @pytest.mark.parametrize 多次调用,每次调用时传入不同的用户名和密码数据。
    在这里插入图片描述

多线程

安装pytest-xdist 插件

pip install pytest-xdist

采用多线程编程

1、可以使用 threading 线程来指定要并发执行的测试用例,但是用例数量一旦多了,就不好去人工分配哪一个线程执行那部分用例,这时候可以使用插件 pytest-xdist,执行 pytest-n5就好了,使用多少个线程并发执行还是得看电脑性能如何,一般使用10~20 个线程为最佳,在自己电脑上就使用5个线程就好了。
2、多线程并发执行用例,相当于多个人同时进行测试,宏观上是这样的,不过微观上对于 cpu 都是串行的,只是调度每一个线程的速度非常快,看起来是并发的而己,因为只有一个cpu,同一时刻,只能执行一个线程,如果有多个cpu 才能真正意义上实现多个测试用例并发执行,不过对于测试而言,无伤大雅,我们了解原理即可,我们主要重在使用。

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

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

相关文章

大话设计模式——16.命令模式(Command Pattern)

简介 请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的对象进行执行。命令模式是一种特殊的策略模式,体现多个策略执行的问题,而不是选择的问题 UML图 应用场景 界面选择、键盘、按钮、事件操作都类似命令模式 …

桌面图标不见了怎么恢复?3个轻松恢复方法请记好!

“我今天刚刚打开电脑就发现我电脑桌面的图标不见了,这是为什么呢?有什么方法可以帮助我快速找回这些图标吗?非常感谢!” 在日常使用电脑的过程中,有时我们会突然发现桌面上的图标不见了,这往往会让人感到困…

断点续传-视频文件的分块和合并

目录 一,前言 二,断点续传 三,断点续传流程: 四,java代码测试分块和合并 视频文件分块: 视频文件合并: 五,应用(简单了解) 一,前言 通常视频文件都比较大,项目中…

读博做FPGA上的AI加速能不能搞啊?

从企业的角度来看,选择在FPGA上进行AI加速仍然有其一定的优势和适用场景,但也有一些挑战需要考虑。我这里有一套嵌入式入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习嵌入式,不妨点个关注,给…

人工智能_大模型023_AssistantsAPI_01_OpenAI助手的创建_API的调用_生命周期管理_对话服务创建---人工智能工作笔记0159

先来说一下一些问题: 尽量不要微调,很麻烦,而且效果需要自己不断的去测试. 如果文档中有图表,大量的图片去分析就不合适了. 是否用RAG搜索,这个可以这样来弄,首先去es库去搜能直接找到答案可以就不用去RAG检索了,也可以设置一个分,如果低于60分,那么就可以去进行RAG检索 微…

网络通信流程

建立完tcp请求再发起http请求 开启系统代理之后,以clash verge为例 127.0.0.1:7897,假设hci.baidu.com的IP为153.37.235.50 发起对hci.baidu.com的HTTP请求,由于开启了系统代理不进行DNS解析,浏览器调用socket()获得一个socket&a…

平面图设计利器:推荐4款好用软件助你完成任务!

在移动应用程序或网页UI设计项目中,平面图软件是必不可少的。市场上的平面图绘制软件层出不穷。UI设计师有必要了解如何找到一款简单易用、专业的平面图绘制软件。本文将分享四款流行的平面图绘制软件,每一款都具有不同的设计功能、易学性和性价比。 即…

基于单片机数码管20V电压表仿真设计

**单片机设计介绍,基于单片机数码管20V电压表仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机数码管20V电压表仿真设计的主要目的是通过单片机和数码管显示电路实现一个能够测量0到20V直流电压的电…

【Redis系列】Spring Boot 集成 Redis 实现缓存功能

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

机器学习知识点

1鸢尾花分类 鸢尾花分类问题是一个经典的机器学习问题,旨在根据鸢尾花的花萼长度、花萼宽度、花瓣长度和花瓣宽度等特征,将鸢尾花分成三个品种:山鸢尾(setosa)、变色鸢尾(versicolor)和维吉尼亚…

云服务器的特点

云服务器是一种基于云计算技术的服务器服务,它提供了可灵活扩展的计算资源和环境。Rak部落小编为您整理发布云服务器的特点,希望对您有帮助。 以下是云服务器的一些主要特点: 1. **灵活性**:云服务器允许用户根据业务需求灵活地配…

经纬恒润首个重卡车身域控制器成功量产

近日,经纬恒润自主研发的首个商用车车身域控制器已搭载江淮格尔发K7成功量产。此次量产成功,将助力江淮格尔发K7的智能舒适性提升,配合江淮L2级智能驾驶系统,大大提高终端用户的使用体验。 伴随软件定义汽车和汽车智能化、网联化…

达梦关键字(如:XML,EXCHANGE,DOMAIN,link等)配置忽略

背景:在使用达梦数据库时,查询SQL中涉及XML,EXCHANGE,DOMAIN,link字段,在达梦中是关键字,SQL报关键词不能使用的错误。 解决办法: 配置达梦安装文件E:\MyJava\dmdbms\data\DAMENG\dm.ini 忽略这些关键词,…

windows安装使用nacos

1.下载安装包 网址:Releases alibaba/nacos GitHub 2.解压,bin目录下修改启动脚本为单机 3.修改数据库配置,使用本地mysql数据库 3.1 创建nacos数据库 3.2 执行 nacos\conf 目录下数据库脚本 4.修改nacos\conf目录下数据库配置 5.点击运…

【AOP入门案例深解析】

AOP 1.AOP简介 AOP(Aspect Oriented Programming)面向切面编程,是一种编程范式,指导开发者如何组织程序结构 OOP(Object Oriented Programming)面向对象编程 作用:在步惊动原始设计的基础上进行…

第二证券|“元素周期表”行情延续 资源股牛市引发激辩

4月8日,以黄金等贵金属、铜等工业金属为首的周期板块继续狂飙。无论是现货,仍是商品期货,抑或是股票商场的资源股,价格均在继续扬升。赛道股和周期股的“跷跷板”效应接连,医药、光伏、芯片等板块普跌。 截至收盘&…

统信UOS系统初识--研发岗

第一步 获取root权限 配置环境等都需要用到root权限,所以我们先获取到root权限,方便下面的操作 下载软件 在UOS应用商店下载的所需应用 版本都比较低 安装node 官网下载了【arm64】的包,解压到指定文件夹,设置链接&#xff0…

Codeforces Round 938 (Div. 3) (A~E)

Codeforces Round 938 (Div. 3) (A~E) 目录:A B C D E A题:Yogurt Sale 标签: 数学(math) 题目大意 酸奶价格, a 元一份,b元两份n问:买n份最少多少钱 思路 a元一份,b元两份&#…

css实现各级标题自动编号

本文在博客同步发布,您也可以在这里看到最新的文章 Markdown编辑器大多不会提供分级标题的自动编号功能,但我们可以通过简单的css样式设置实现。 本文介绍了使用css实现各级标题自动编号的方法,本方法同样适用于typora编辑器和wordpress主题…

【C++】C++11可变参数模板

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 可变参数模板的定义…