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打开url并按指定块读取网页内容的方法
Apr 29 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
Jul 28 Python
使用Python制作微信跳一跳辅助
Jan 31 Python
Python实现的视频播放器功能完整示例
Feb 01 Python
linux下python使用sendmail发送邮件
May 22 Python
python中logging模块的一些简单用法的使用
Feb 22 Python
python 叠加等边三角形的绘制的实现
Aug 14 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
python实现人脸签到系统
Apr 13 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
Sep 05 Python
Python Pandas pandas.read_sql_query函数实例用法分析
Jun 21 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
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
基于php判断客户端类型
2016/10/14 PHP
php组合排序简单实现方法
2016/10/15 PHP
php技巧小结【推荐】
2017/01/19 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
MSN消息提示类
2006/09/05 Javascript
javaScript parseInt字符转化为数字函数使用小结
2009/11/05 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
2015/08/21 NodeJs
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
详解nodejs中express搭建权限管理系统
2017/09/15 NodeJs
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
jQuery实现简单三级联动效果
2020/09/05 jQuery
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
2019/10/24 Python
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
C#的几个面试问题
2016/05/22 面试题
异步传递消息系统的作用
2016/05/01 面试题
会计专业大学生职业生涯规划书
2014/02/11 职场文书
本科毕业生自荐信
2014/05/26 职场文书
暑期培训心得体会
2014/09/02 职场文书
个人批评与自我批评
2014/10/15 职场文书
离婚案件上诉状
2015/05/23 职场文书
尊师重教主题班会
2015/08/14 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
小程序wx.getUserProfile接口的具体使用
2021/06/02 Javascript
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android