python单元测试框架pytest的使用示例


Posted in Python onOctober 07, 2020

首先祝大家国庆节日快乐,这个假期因为我老婆要考注会,我也跟着天天去图书馆学了几天,学习的感觉还是非常不错的,这是一篇总结。

这篇博客准备讲解一下pytest测试框架,这个框架是当前最流行的python语言最流行的单测框架,不掌握可不行,首先这个框架属于第三方模块,需要通过pip安装即可

pip install pytest

下面我们进入正题

一、介绍pytest的运行规则

1、测试文件的名称必须要以test_*.py的格式,或者*_test.py的格式

2、测试类的名称必须要以Test开头,且这个类还不能有构造方法(__init__)

3、测试函数的名称必须要以test开头

pytest默认的就按照上面的三条规则来执行案例,当然我们可以自定义运行规则,这个我们后面在讲,这个不重要,看一个最简单的例子

import os
import pytest
 
# pytest是python的单元测试框架
 
def func(x):
 return x + 1
 
 
def test_a():
 print("____test_a____")
 assert func(2) == 5
 
def test_b():
 print("____test_b____")
 assert func(2) == 3
 
if __name__ == '__main__':
 pytest.main(["-s","pytest1.py"])

二、介绍pytest的前置条件和后置条件,类似unittest的testfixture(测试固件)

如果同学们之前用过unittest测试框架,对测试固件这个这个名词就不会陌生了,如果不清楚,可以看下之前我写的unittest测试框架的博客(https://3water.com/article/197004.htm)

pytest框架的测试固件有两种,一种函数级别的,一种是类级别,执行的顺序如下

a、执行类的前置条件

b、执行函数的前置条件

c、执行函数的后置条件

d、执行类的后置条件

使用也非常简单,当时函数的命名一定要和我下面的备注保持完全一致

# pytest的前置和后置条件
 
# 1、函数级别 setup teardown
# 运行于测试方法的开始和结束
# 运行一个测试用例,会运行一次setup和teardown
 
# 2、类级 setup_class teardown_class
# 运行于测试类的开始和结束
# 一个测试类只运行一次setup_class teardown_class

1、函数式的案例--函数级别的前置条件&后置条件

import os
import pytest
 
def func(x):
 return x + 1
 
 
def test_a():
 print("____test_a____")
 assert func(2) == 5
 
def test_b():
 print("____test_b____")
 assert func(2) == 3
 
 
def setup():
 print("函数级别的前置")
 
def teardown():
 print("函数级别的后置")

执行结果如下

python单元测试框架pytest的使用示例

2、类式的案例--函数级别的前置条件&后置条件

class Testclass:
 def test_a(self):
  print("____test_a____")
  assert func(2) == 5
 
 def test_b(self):
  print("____test_b____")
  assert func(2) == 3
 
 def setup(self):
  print("函数级别的前置")
 
 def teardown(self):
  print("函数级别的后置")
if __name__ == '__main__':
 pytest.main(["-s","pytest2.py"])

执行结果如下

python单元测试框架pytest的使用示例

3、类级别的前置条件&后台置条件

import pytest
 
def func(x):
 return x + 1
 
 
class Testclass:
 def test_a(self):
  print("____test_a____")
  assert func(2) == 5
 
 def test_b(self):
  print("____test_b____")
  assert func(2) == 3
 
 def setup(self):
  print("函数级别的前置")
 
 def teardown(self):
  print("函数级别的后置")
  
 def setup_class(self):
  print("类级别的前置")
 
 def teardown_class(self):
  print("类级别的后置")
if __name__ == '__main__':
 pytest.main(["-s","pytest3.py"])

结果如下

python单元测试框架pytest的使用示例

三、介绍如何修改pytest的配置文件

我们在博客的第一部分介绍了pytest框架的运行规则,这里我们可以修改pytest的配置文件,改变框架运行规则

首先我们要在案例的目录下创建一个pytest.ini的配置文件

python单元测试框架pytest的使用示例

内容如下

# 创建pytest.ini文件
# [pytest]
# addopts=-s
#这个先这样写,这个主要是执行参数
 
 
# testpaths = testcase
# 只执行这个目录下的文件
#
# python_files = test_*.py
#执行的文件的名字
 
 
# python_classes = Test_*
#执行类的名字
 
# python_functions = test_*
# 执行函数的名字

配置文件截图

python单元测试框架pytest的使用示例

通过上面的步骤,我们就可以改变pytest的运行规则

四、介绍pytest的断言

pytest的断言是用python的断言,他不像unittest框架,他自己实现了断言

# -*- coding:utf-8 -*-
 
# pytest是使用python自带的断言
import pytest
 
def func(x):
 return x + 1
 
 
def test_a():
 print("____test_a____")
 assert func(2) == 5
 
def test_b():
 print("____test_b____")
 assert not func(2) == 3
 
def test_c():
 print("____test_b____")
 assert func(2) in ["a","b","c"]
 
 
def test_d():
 print("____test_b____")
 assert func(2) not in ["a","b","c"]
 
 
if __name__ == '__main__':
 pytest.main(["-s","pytest5.py"])

五、介绍pytest的标记(mark)

1、可以实现给函数打标记,实现哪些标记执行,哪些标记不执行

一个函数可以打多个标记,一个标记同时可以给多个函数打标记。只需要让这个标记的装饰器函数装饰我们的测试类或者测试函数

class Test_mark():
 @pytest.mark.test01
 def test_a(self):
  print("mark test a")
 
 @pytest.mark.test02
 def test_b(self):
  print("mark test b")
 
 
if __name__ == '__main__':
 pytest.main(['-s',"pytest6.py"])

还有其它的执行方式

# pytest -m test01
 
# pytest -n "test01 or test02"
 
# pytest -m "not test01"

2、标记可以实现不跳过某个、某些案例的作用

# -*- coding:utf-8 -*-
 
import pytest
 
# skip跳过执行某个案例
@pytest.mark.skip(reson="只是这个函数用例不执行")
def test_a():
 
 print("testa")
 
 
def test_b():
 print("testb")
 
 
@pytest.mark.skip(reson="整个类下的案例都不会执行")
class Test_skip():
 def test_a(self):
  print("testa")
 
 def test_b(self):
  print("testb")
 
 
# 可以根据条件判断,为真,则不执行
@pytest.mark.skipif(1 > 2,reson="整个类下的案例满足条件都不会执行")
class Test_skipif():
 def test_a(self):
  print("testa")
 
 def test_b(self):
  print("testb")

六、介绍pytest的数据参数化

1、传入单个参数

# pytest的数据参数化
 
# 1、传入单个参数
#
# pytest.mark.parametrize(argnames,argvalues)
# argnames 参数的名称
#
# argvalues 参数对应的值,类型必须是可迭代的类型,一般使用list
 
 
@pytest.mark.skip(reson="只是这个函数用例不执行")
def test_a():
 print("testa")
 
 
@pytest.mark.parametrize("name",["cui1","cui2","cui3","cui4"])
def test_b(name):
 print("testb----->{name}".format(name = name))
 
if __name__ == '__main__':
 pytest.main(["-s", "pytest8.py"])

实现的效果name作为参数的名称,这个案例会执行4次,参数分别是name=“cui1”\name="cui2"\....

python单元测试框架pytest的使用示例

2、传入多个参数

import pytest
 
 
# pytest的数据参数化
 
# 1、传入多个参数
#
# pytest.mark.parametrize((argnames1,argnames2),[(argvalues1,argvalues1),(argvalues1,argvalues1)],(argvalues1,argvalues1)]])
 
 
@pytest.mark.skip(reson="只是这个函数用例不执行")
def test_a():
 print("testa")
 
 
@pytest.mark.parametrize(("name","age"),[("cui1",12),("cui2",13),("cui3",14)])
def test_b(name,age):
 print("testb----->{name}----->{age}".format(name = name,age = age))
 
if __name__ == '__main__':
 pytest.main(["-s", "pytest9.py"])

实现的效果如下

python单元测试框架pytest的使用示例

七、介绍pyest的常用第三方插件

1、美化pytest的输出报告插件

# pip install pytest-html
 
# 用来美化输出报告的插件
# 只需要在配置文件中加这个配置即可
#
# addopts=-s --html=report.html

效果

python单元测试框架pytest的使用示例

python单元测试框架pytest的使用示例

2、失败案例重试插件,下面的示例实现的就是失败重启3,失败后间隔2s在进行重试

# pip install pytest-rerunfailures
# 失败重试的第三方插件
# 只需要在配置文件中加这个配置即
# --reruns 3 --reruns-delay 2

至此,pytest的框架基本使用已经讲解清楚,小伙伴们还有不清楚的吗?欢迎大家来沟通!!!

到此这篇关于python单元测试框架pytest的使用示例的文章就介绍到这了,更多相关python单元测试框架pytest内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
Python单例模式的两种实现方法
Aug 14 Python
Python常见MongoDB数据库操作实例总结
Jul 24 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
Apr 05 Python
python 对字典按照value进行排序的方法
May 09 Python
python全栈要学什么 python全栈学习路线
Jun 28 Python
详解Python self 参数
Aug 30 Python
python中的subprocess.Popen()使用详解
Dec 25 Python
解决Pytorch 加载训练好的模型 遇到的error问题
Jan 10 Python
如何利用Python识别图片中的文字
May 31 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 Python
pytorch 权重weight 与 梯度grad 可视化操作
Jun 05 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 #Python
Python colormap库的安装和使用详情
Oct 06 #Python
Django-Scrapy生成后端json接口的方法示例
Oct 06 #Python
Python3如何使用range函数替代xrange函数
Oct 05 #Python
Python threading模块condition原理及运行流程详解
Oct 05 #Python
Python urllib库如何添加headers过程解析
Oct 05 #Python
Python3获取cookie常用三种方案
Oct 05 #Python
You might like
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
js select option对象小结
2013/12/20 Javascript
JS取request值以及自动执行使用示例
2014/02/24 Javascript
Javascript中Array.prototype.map()详解
2014/10/22 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
Knockoutjs 学习系列(二)花式捆绑
2016/06/07 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
详解Django中的权限和组以及消息
2015/07/23 Python
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
英文版网络工程师求职信
2013/10/28 职场文书
《美丽的小路》教学反思
2014/02/26 职场文书
小学生暑假家长评语
2014/04/17 职场文书
2014年创先争优活动总结
2014/05/04 职场文书
本科生自荐信
2014/06/18 职场文书
工程质量保证书
2015/05/09 职场文书
利用python做表格数据处理
2021/04/13 Python
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript