单元测试框架-pytest

2023-09-12 17:40:26

单元测试框架-pytest

官网

常用插件
  • pytest-html: 生成html报告
  • pytest-xdist: 实现并发测试
  • pytest-ordering: 实现测试用例顺序设置
  • pytest-rerunfailures: 测试用例失败重试
  • allure-pytest: 生成测试报告
引入依赖

在项目根目录下创建:requirements.txt

pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
allure-pytest

执行命令

pip install -r requirements.txt

验证安装成功

pytest --version

使用Pytest
规范
  • 模块名必须以test_开头或者_test结尾
  • 测试类必须以Test开头,并且不能有__init__方法
  • 测试方法必须以test开头
运行方式
  • 主函数模式

    pytest.main()
    
  • 命令行模式

    pytest
    
  • 通过读取pytest.ini配置文件运行

    • 一般放在项目根目录
    • 编码:必须时ANSI,可以使用notepad++修改编码格式
    • 作用:改变pytest默认行为
    • 运行规则:主函数与命令行模式都会读取该文件
    [pytest]
    #命令行参数,用空格分隔
    addopts = -vs
    # 测试用例文件夹,可以自己配置
    testpaths = ./testcase
    # 配置测试搜索的模块文件名称
    python_files = test*.py
    # 配置测试搜索的测试类名
    python_classes = Test*
    # 配置测试搜索的测试函数名
    python_functions = test
    #测试分组
    markers =
    	g11n:国际化测试组
    	i10n:本地化测试组
    
  • 执行指定模块

    pytest.main(['test_module.py'])
    
  • 指定目录

    pytest.main(['dir_name'])
    
  • 通过nodeid指定测试用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成

    pytest.main('./dir_name/module.py::class_name::fun_name')
    
参数详情
  • -s:显示测试用例的调试内容

  • -v:显示测试用例详细信息

  • -n:多线程执行测试用例

  • –reruns:设置重试次数

  • -x:只要有一个测试用例失败,停止测试

  • –maxfail:设置几个测试失败停止运行

  • -k:根据测试用例的部分字符串指定测试用例

  • -m:指定测试分组

执行顺序
  • unittest:按ascii的大小来运行

  • pytest:默认从上到下

指定测试用例顺序:需要安装pytest-ordering

@pytest.mark.run(order=)
分组测试
@pytest.mark.mark_name
  • mark_name:为自定义的分组名称

运行测试

pytest -m "mark_name"

运行多个分组

pytest -m "mark1 or mark2"
跳过测试
  • 无条件

    @pytest.mark.skip(reason="原因")
    
  • 条件跳过

    @pytest.mark.skipif(expr, reason="原因")
    
生成报告
  • HTML

    pytest --html ./save_path/report.html
    
  • Allure

    下载

    • 解压项目并配置到环境变量中,验证是否安装成功
    allure --version
    
    • 生成json格式临时报告
    --alluredir  ./temp
    
    • 生成allure报告
    allure generate ./temp -o ./report --clean
    

    -o: 报告输出目录

    –clean:对目录进行清除

测试夹具(前后置)
  • setup_class:所有测试用例执行之前运行一次
  • teardown_class:所有测试用例执行之后运行一次
  • setup_method:每个测试用例执行之前运行一次
  • teardown_method:每个测试用例执行完成执行一次

部分测试用例前后置实现:@pytest.fixture()

参数

  • scope:作用域
    • function 方法级别的前后置 (默认)
    • class 类级别的前后置
    • module 模块级别的前后置
    • package/session 包级别的前后置
  • params: 参数化
    • 支持参数类型:(列表:[] 元组() 字典列表[{},{},{}],字典元组:({},{},{}))
  • autouse: 自动执行 默认值:False 如果为False,需要将函数名作为需要调用的方法的参数
  • ids: 当使用params参数化时,给参数列表每一个值设置一个变量名
  • name: 表示的时被@pytest.fixture标记的方法取一个别名
# yield返回后面可以有代码,return后面不能有代码,返回值即为测试方法的所传入的参数
# 参数名必须为request,否则报错[not found]
# 使用name对标记的方法起别名后不能使用原函数名作为参数,否则报错
@pytest.fixture(scope='function', params=['赵姗姗', '马化腾', '张一鸣'], ids=['zss', 'mht', 'zym'], name='fixt')
def my_fixture2(request):
    print("前置")
    yield request.param
    print("后置")

conftest.py与fixture结合使用

  • 通常在每个测试包下可以包含一个conftest.py文件,通常将前后置fixture定义在该文件中,在其他模块中无需导入即可使用
  • 夹具可以使用当前包及其父包的conftest.py中所定义的,同级包无法使用
断言
assert
数据驱动
    @pytest.mark.parametrize('args', ['zss', 'nan', 'lis'])
    def test_ddt(self, args):
        print(args)

    @pytest.mark.parametrize('name,age', [('张三', 21), ('李四', 22), ('王五', 23)])
    def test_ddt2(self, name, age):
        print(name)
        print(age)
  • 参数1:迭代的变量名
  • 参数2:迭代的value
更多推荐

元素全排列问题的新思路(DFS,递归,计数器)

目录前言1,普通DFS实现1~n的元素全排列2,计数器+DFS实现重复元素全排列总结前言我们之前看到的全排列问题的解法都是通过交换法达到的,去重的效果也是通过判断当前元素前是否有相同元素来实现,今天我们带来一个全新的思路,使我们直接进行深度优先搜索+一个计数器就可以实现,不用交换。1,普通DFS实现1~n的元素全排列我

数据结构 | 数据结构的“基本概念”和“术语”

数据结构的“基本概念”和“术语”:1.数据(Data)2.数据元素(DataElement)3.数据项(DateItem)4.数据、数据元素、数据项三者之间的关系5.数据对象(DataObject)6.数据结构(DataStructure)6.1数据结构(DataStructure)的种类/两个层次:逻辑结构逻辑结构的

数据结构入门 — 二叉树的概念、性质及结构

本文属于数据结构专栏文章,适合数据结构入门者学习,涵盖数据结构基础的知识和内容体系,文章在介绍数据结构时会配合上动图演示,方便初学者在学习数据结构时理解和学习,了解数据结构系列专栏点击下方链接。博客主页:DuckBro博客主页系列专栏:数据结构专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢

Mysql高级——索引优化和查询优化(1)

索引优化1.数据准备学员表插50万条,班级表插1万条。建表CREATETABLE`class`(`id`INT(11)NOTNULLAUTO_INCREMENT,`className`VARCHAR(30)DEFAULTNULL,`address`VARCHAR(40)DEFAULTNULL,`monitor`INTN

数据科学中的数据库简介

推荐:使用NSDT场景编辑器快速搭建3D应用场景用于高效视频、AI和图形的通用加速器数据科学中的数据库简介数据科学涉及从大量数据中提取价值和见解,以推动业务决策。它还涉及使用历史数据构建预测模型。数据库有助于对如此大量的数据进行有效的存储、管理、检索和分析。因此,作为一名数据科学家,您应该了解数据库的基础知识。因为它们

安卓页面绘制流程(3)Window注册

前言:本文属于安卓页面绘制流程的第3篇,主要介绍应用是如何把APP侧的Window向system进行注册的。主要分为2大块:第一块,APP侧在resume周期时向系统侧申请绑定。第二块,系统侧收到请求后处理绑定的流程。一.APP侧Window注册在上一篇文章中,我们已经讲过,在Activity的create周期内,其所

什么是Vue的自定义指令(custom directives)?如何自定义指令?

聚沙成塔·每天进步一点点⭐专栏简介⭐Vue.js的自定义指令⭐示例⭐写在最后⭐专栏简介前端入门之旅:探索Web开发的奇妙世界欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的

Learn Prompt-Prompt 高级技巧:MetaGPT

MetaGPT是一项引起广泛关注的研究成果,它引入了一个将人工工作流程与多智能体协作无缝集成的框架。通过将标准化操作(SOP)程序编码为提示,MetaGPT确保解决问题时采用结构化方法,从而减少出错的可能性。🎉开始阅读前,如果你对其他文章感兴趣,可以到欢迎页关注我们!「卡尔的AI沃茨」开源中文社区实时获得后续的更新和

网络安全进阶学习第二十课——CTF之文件操作与隐写

文章目录一、文件类型识别1、File命令2、Winhex3、文件头残缺/错误二、文件分离操作1、Binwalk工具2、Foremost3、dd4、Winhex三、文件合并操作1、Linux下的文件合并2、Windowsa下的文件合并四、文件内容隐写Winhex五、图片文件隐写1、图片混合2、LSB(最低有效位Least

PLC串口通讯和通讯接口知识汇总

在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗?一、什么是串口通讯?串口是一种接口标准,是计算机上一种非常通用设备通信的协议。它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。典型的串口通讯标准常见有如下三种。EIARS232(通常简称“RS232”):

【C++】命名空间 namespace 与 标准流 iostream ( 命名空间概念简介 | 命名空间定义 | 命名空间使用 | iostream 中的命名空间分析 )

文章目录一、命名空间namespace1、命名空间基本概念2、名称概念4、C语言的命名空间3、命名空间避免标识符冲突二、命名空间定义1、命名空间基本概念2、命名空间定义语法3、代码示例-命名空间定义使用三、命名空间使用1、命名空间默认访问方式2、使用命名空间3、使用默认的命名空间4、代码示例-使用命名空间四、标准流io

热文推荐