Pytest自动化测试框架

2023-11-19

 fixture

特点:

  1. 命令灵活:对于setup,teardown可以省略

  2. 数据共享:在conftest.py配置里写方法可以实现数据共享,不需要import导入,可以跨文件共享

  3. scope的层次及神奇的yield组合相当于各种setup和teardown

  4. 实现参数化

应用

  • 场景:

测试用例执行时,有的用例需要登录才能执行,有些用例不需要登录。

setup和teardown无法满足这种情况,但是fixture可以。默认scope(范围):function

  • 步骤:

    1. 导入pytest

    2. 在登录的函数上添加@pytest.fixture()

    3. 在要使用的测试方法中传入(登录函数名称)

    4. 不传入的就不登录,直接执行测试方法。

fixture作用域

取值 范围 说明
function 函数级 每一个函数或方法都会调用
class 类级别 每个测试类只执行一次
module 模块级 每个.py文件调用一次
package 包级 每个python包只调用一次(暂不支持)
session 会话 每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法

session是在整个项目中只执行一次的代码

yield关键字

场景:

你已经可以将测试方法【前要执行的或依赖的】解决了,那测试方法后销毁清除数据要如何进行?

解决:

通过在fixture函数中加入yield关键字,yield是调用第一次返回结果,第二次执行它下面的语句返回。

步骤:

@pytest.fixture(scope=module)

在登录的方法中加yield,之后加销毁清除的步骤

import pytest
 
@pytest.fixture()
def login():
    # setup
    token = '1235236fdg'
    print("登录功能")
    yield token# 相当于return 返回none
    # teardown
    print("退出登录操作")
 
def test_search():
    print("搜索功能")
 
def test_cart(login):
    print(f"token:{login}")
    print("购物车")

数据共享

场景:

你与其他工程师合作一起开发时,公共的模块要在不同文件中,要在大家都访问的到的地方

解决:

使用conftest.py这个文件进行数据共享,并且它可以放在不同位置起着不同的范围共享作用

  • 前提:

    1. conftest文件名不能换

    2. 放在项目下是全局的数据共享

  • 执行:

    1. 系统执行到参数login时先从本模块中查找是否有这个名字的变量之类的

    2. 之后在conftest.py中找是否含有

  • 步骤:

将登录模块带@pytest.fixture写在conftest.py

自动应用

  • 场景:

不想原测试方法有任何改动,或全部都自动实现自动应用,没特例,也都不需要返回值时可以选择自动应用的方法

  • 解决:

使用fixture中的参数autouse=True实现

  • 步骤:

在方法上面加@pytest.fixture(autouse=Ture)

参数化

  • 场景:

测试离不开数据,为了数据灵活,一般数据都是通过参数传的

  • 解决:

使用fixture中的固定参数request传递

  • 步骤:

在fixture中添加@pytest.fixture(params=[1,2,3,'linda'])

在方法参数写request,方法体里面使用request.param接受参数

@pytest.fixture(params=['hogwarts','joker'])
def demo_params(request):
    print(f'用户名为:{request.param}')
    return request.param


def test_demo(demo_params):
    print(f"数据为:{demo_params}")
  • 注意:fixture的参数是params,而调用的时候是request.param,没有s

总结:

  1. 模拟setup,teardown(一个用例可以引用多个fixture)

  2. yield的用法

  3. 作用域(session,module,类级别,方法级别)

  4. 自动执行(autouse参数)

  5. conftest.py用法,一般会把fixture写在conftest.py文件中

  6. 实现参数化

pytest.ini文件

  1. pytest.ini是pytest的配置文件

  2. 可以修改pytest的默认行为

  3. 不能使用中文符号,包括汉字,空格 ,引号,冒号等

作用:

  1. 修改用例的命名规则

  2. 配置日志格式,比代码配置方便很多

  3. 添加标签,防止运行过程报警告错误

  4. 指定执行目录

  5. 排除搜索目录

改变pytest运行规则

[pytest]
;执行check_开头的所有文件
python_files = check_* test_*
;执行所有的以Test和Check开头的类
python_classes = Test* Check*
;执行所有以test_和check_开头的方法
python_functions = check_* test_*
  • 注意:win系统的pytest.ini文件不能写中文,注释也不行

pytest配置-添加默认参数

addopts = -v -s --alluredir=./results

指定/忽略执行目录

;设置执行得路径
;testpaths = bilibili baidu
;忽略某些文件夹/目录
norecursedirs = result logs datas test_demo*

插件开发

  • pytest插件分类

    1. 外部插件:pip install 安装的插件

    2. 本地插件:pytest自动模块发现机制(conftest.py存放的)

    3. 内置插件:代码内部的_pytest目录加载(hook函数)

官网:PyPI · The Python Package Index

常用插件

每一种测试框架收集测试用例的顺序是不一样的

pytest执行顺序控制

  • 场景:

对于集成测试,经常会有上下文依赖关系的测试用例。如十个步骤,拆分成十个case,这时候能知道到底执行到哪步报错。

用例默认执行顺序:自上而下执行

  • 解决:

可以通过setup,teardown和fixture来解决,也可以使用pytest-ordering插件来解决

  • 安装:pip install pytest-ordering

  • 用法:@pytest.mark.run(order=2)

  • 注意:多个插件装饰器(>2)的时候,有可能会发生冲突

并行与分布式并发执行(xdist)

场景1:

  • 测试用例1000条,一个用例执行1分钟,一个测试人员需要1000分钟,通常我们会用人力成本换取时间成本,加几个人一起执行,时间就会缩短。这就是一种分布式场景。

场景2:

  • 假设有个报名系统,对报名总数进行统计,数据同时进行修改操作的时候有可能出现问题,需要模拟这个场景,需要多用户并发请求数据

解决:

  • 使用分布式并发执行测试用例,分布式插件:pytest-xdist

  • 安装:pip install pytest-xdist

  • 注意:用例多的时候效果明显,多进程并发执行,同时支持allure

hook函数

1. 介绍

  • 是个函数,在系统消息触发时被系统调用

  • 自动触发机制

  • Hook函数的名称是确定的

  • pytest有非常多的hook函数

  • 使用时直接编写函数体

  • 执行是有先后顺序的

  • 可以在不同阶段实现不同的功能

pytest执行过程

执行顺序:

pytest编写插件1-修改默认编码

pytest_collection_modifyitems收集上来的测试用例实现定制化功能

解决问题:

  • 自定义用例的执行顺序

  • 解决编码问题(中文的测试用例名称)

  • 自动添加标签

from typing import List


# 修改编码的hook函数
def pytest_collection_modifyitems(
    session: "Session", config: "Config", items: List["Item"]
) -> None:
    # items里的name是测试用例的名字,nodeid是测试用例的路径
    print(items)
    for item in items:
        # 如果想改变unicode编码格式的话,需要先encode成utf-8格式的,再decode成unicode-escape就可以了
        item.name = item.name.encode('utf-8').decode('unicode-escape')
        item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')

编写插件2-添加命令行参数

# 定义命令行参数的hook函数
def pytest_addoption(parser):
    # group 将下面所有的option都展示在这个group组下
    mygroup = parser.getgroup('hogwarts')
    mygroup.addoption('--env',  # 注册一个命令行选项
                      default='test',  # 参数的默认值
                      dest='env',  # 存储的变量,为属性命令,可以使用option对象访问到这个值
                      help='set your run env')  # 帮助提示,参数的描述信息


@pytest.fixture(scope='session')
def cmd_option(request):
    # request获取命令行的参数,config拿到pytest相关配置,getoption拿到命令行参数
    return request.config.getoption('--env')

打包发布

打包项目构成:

  • 源码包

  • setup.py

  • 测试包

from setuptools import setup, find_packages

setup(
    name='pytest_encode',
    url='',
    version='1.0',  # 版本
    author='joker',  # 作者
    author_email='',  # 邮箱
    description='set your encoding and logger',  # 描述用法
    long_description='Show Chinese for you mark.parametrize().',  # 完整描述
    classifiers=[  # 分类索引,pip所属包的分类,方便在pip官网中搜索
        'Framework :: Pytest',
        'Programming Language :: Python',
        'Topic :: Software Development :: Testing',
        'Programming Language :: Python :: 3.8',

    ],
    license='proprietary',  # 程序授权信息
    packages=find_packages(),  # 通过导入的方式发现当前项目下所有的包
    keywords=[  # 便于pip进行分类
        'pytest', 'py.test', 'pytest_encode'
    ],
    # 需要安装的依赖
    install_requires=[
        'pytest'
    ],
    # 入口模块,或者入口函数(最重要的)
    entry_points={
        'pytest11': [
            'pytest_encode = pytest_encode.main'
        ]
    },
    zip_safe=False
    # 针对win系统,不设置成false会出错
)

打包命令

依赖包安装:

  • pip install setuptools python的包管理工具,负责安装和发布,尤其是安装拥有依赖关系的包

  • pip install wheel 生成 *.whl格式的安装包,本质上也是一个压缩包

打包命令:(切到setup.py所在的目录下执行)

python setup.py sdist bdist_wheel

dist目录下.whl的文件,可以通过pip install 下载

发布命令

  • python3 -m pip install --user --upgrade twine ## 安装twine工具

  • python3 -m twine upload --repository testpypi dist/* ## 上传代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pytest自动化测试框架 的相关文章

随机推荐

  • Thinking in Java

    Thinking in Java Java编程思想 学习总结心得 一 前序 学习java也已经有大约两年时间 但大多数断断续续 零散没有系统学习 这次经多方推荐购买了一本java学习必读书籍 Thinking in Java 学习之余将书中
  • python3 [入门基础实战] 爬虫入门之智联招聘的学习(一)

    老实说 懵逼啊 这次爬取的是智联招聘上的求职数据 虽然没有仔细正确核对一下数据是否具有重复性 随机抽查了些 数据大部分还是能对上来的 这次爬取的智联招聘上的数据90页 每页60条 主要抓取的是android开发工程的数据 抓取的数据为全国的
  • 行业权威来揭秘,商用PC为什么首选12代酷睿

    第12代酷睿处理器可以提供更卓越的性能 凭借架构先进性让商用台式机和笔记本电脑为用户带来更好的体验 帮助企业和员工效率倍增 作者 九月 来源 PConline 想要让办公效率进一步提升 一台强大的PC设备是必不可少的生产力和内容创作工具 而
  • SQL Server如何建立表关系

    SQL Server怎么建立关系表 用教师表和学生表举例 两表建立关系之前 要检查连接的条件满足否 比如学生表里的外键 教师ID 要和教师表里的主键 教师ID 的数据类型相同 也就是建立关系的条件数据类型要相同 确认条件满足之后开始建立关系
  • 对象式单片机外部模块驱动编写详解——DAC8552为例

    对象式单片机外部模块驱动编写详解 DAC8552为例 对象式驱动原理 DAC8552基本介绍 DAC8552驱动抽象 源码文件及其解释 参考资料 具体的代码和例程请参照以下GitHub仓库 记得给我star哦 https github co
  • 区块链能提供有效的身份管理?

    随着身份盗窃和数据泄露在世界各地越来越多的情况下 身份验证是一个主要问题 对访问数据的人进行身份验证实际上是他们要求的 每天 数以百万计的人在网上进行不同的活动 从研究一个学术话题 到购买新的项目 到在社交媒体平台上发表评论 甚至进行不同的
  • /etc/init.d

    etc init d目录在Linux系统中可是大名鼎鼎 它只负责一件事情 但却涉及到全系统 它包含系统中各种服务的start stop脚本 从acpid到x11 common 其重要性可见一斑 init d 初始化脚本称之为System V
  • 如何生成序号_合并单元格自动添加序号,还在手动输入就out了,学会三组函数公式一秒搞定...

    相信许多同学在用Excel表格登记各类数据的时候 为了规范表格我们经常会用到序号来进行数据标记 许多朋友在更新序号的时候 基本都是手动输入1 2 3等等 然后手动往下拖动 但是这样数据量比较大的时候 就会比较麻烦 而且如果数据是有合并单元格
  • React-Native使用react-native-community/art实现水波纹、音频波动效果

    效果如下 可以通过改变volume值实现动态效果 贴组件代码 复制就能用 依赖package json react native community art 1 1 2 react native 0 61 4 组件代码DancingLine
  • 第一次竞赛-B.连接竹竿

    B 连接竹竿 Alice从市场上买了N根竹竿 每根竹竿都以 节 为单位 这些竹竿中最短的有A节 最长的有B节 其余竹竿各有长短 每根竿的节数也必定在 A B 范围内 现在Alice希望将这些竹竿用连接部件全部接成一根长竹竿 连接部件的长度忽
  • hive详解——RANK()、DENSE_RANK()、ROW_NUMBER()

    概念 RANK 排序相同时会重复 总数不会变 DENSE RANK 排序相同时会重复 总数会减少 ROW NUMBER 会根据顺序排算 实操讲解 现在有一张score表 做查询操作 SELECT RANK over PARTITION BY
  • 初识C++

    目录 前言 什么是C 1 第一个关键字 namespace 1 namespace的用处 2 如果使用命名空间中的变量和函数 2 C 的输入和输出函数 3 缺省参数 4 函数重载 5 引用 1 初识引用 2 引用的类型 3 引用的特性 4
  • 微信小程序领取查看优惠券,会员卡总结

    又见面了 新项目新需求 这次谈谈小程序微信卡券领卡到查看卡券的功能 在做之前 脑子一头雾水 网上查了资料 基本都是领取卡券的介绍 以为很难实现呢 其实主要工作还是在后台配置以及接口处理 前端的工作量不多 主要就是调取小程序提供的卡券接口 a
  • Gephi入学教程基础记录

    Gephi入学教程基础记录 Gephi版本0 8 1 1 CSV数据输入 1 1 中文显示问题 1 2 标签设置 2 自动生成数据 3 编辑工具介绍 1 节点的移动 2 节点的放大和缩小 3 调整节点颜色 4 边的粗细的调整 6 节点的编辑
  • (可能是)完美解决WSL2重启变IP问题

    WSL2的升级对比WSL1 IO升级是巨大的 以及完整的Linux内核 等等都是完美的Linux发行版 Windows10 解决方法有几步一步一步解决 编辑bat脚本 此方法在 microsoft WSL issues 418 获得 开机启
  • Anlios装grouplist 组件之后报错,安装tiger-vncserver

    因为之前升级了一个epel release源 然后containerd也装进去了 但是版本太低 然后以为是runc挡住了 发现没有runc 删完了containerd就可以装了 rpm ivh http mirrors wlnmp com
  • 用数组实现队列和循环队列

    1 先用数组实现一个队列 package com lv queue import java util Scanner public class ArrayQueueDemo public static void main String ar
  • Unity重要知识点

    脚本生命周期 每当脚本被加载时调用一次 1 在Awake中做一些初始化操作 void Awake 初始化public成员 2 在每次激活脚步时调用 void OnEnable 在第一次调用Update之前调用一次Start 即使取消激活 再
  • 通过注册表永久更改cmd控制台的编码为65001

    1 Win R快捷键打开注册表输入regedit 2 路径填入 计算机 HKEY LOCAL MACHINE SOFTWARE Microsoft Command Processor 3 在右边窗口新建字符串值autorun 4 双击打开a
  • Pytest自动化测试框架

    fixture 特点 命令灵活 对于setup teardown可以省略 数据共享 在conftest py配置里写方法可以实现数据共享 不需要import导入 可以跨文件共享 scope的层次及神奇的yield组合相当于各种setup和t