Python测试框架:pytest学习笔记


Posted in Python onOctober 20, 2020

 python通用测试框架大多数人用的是unittest+HTMLTestRunner,这段时间看到了pytest文档,发现这个框架和丰富的plugins很好用,所以来学习下pytest.

Python测试框架:pytest学习笔记

pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:

  • 简单灵活,容易上手
  • 支持参数化
  • 能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)
  • pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等
  • 测试用例的skip和xfail处理
  • 可以很好的和jenkins集成
  • report框架----allure 也支持了pytest

安装pytest:

pip install -U pytest

验证安装的版本:

pytest --version

几个pytest documentation中的例子:

例子1:

import pytest

# content of test_sample.py
def func(x):
 return x + 1
def test_answer():
 assert func(3) == 5

命令行切换到文件所在目录,执行测试(也可以直接在IDE中运行):

Python测试框架:pytest学习笔记

这个测试返回一个失败报告,因为func(3)不返回5。

例子2:

当需要编写多个测试样例的时候,我们可以将其放到一个测试类当中,如:

class TestClass: 
 def test_one(self): 
 x = "this" 
 assert 'h' in x 
 
 def test_two(self): 
 x = "hello" 
 assert hasattr(x, 'check')

运行以上例子:

Python测试框架:pytest学习笔记

从测试结果中可以看到,该测试共执行了两个测试样例,一个失败一个成功。同样,我们也看到失败样例的详细信息,和执行过程中的中间结果。-q即-quiet,作用是减少冗长,具体就是不再展示pytest的版本信息。

如何编写pytest测试样例

通过上面2个实例,我们发现编写pytest测试样例非常简单,只需要按照下面的规则:

  • 测试文件以test_开头(以_test结尾也可以)
  • 测试类以Test开头,并且不能带有 init 方法
  • 测试函数以test_开头
  • 断言使用基本的assert即可

运行模式

   Pytest的多种运行模式,让测试和调试变得更加得心应手,下面介绍5种常用的模式。在介绍之前需要提醒一句,运行pytest时会找当前目录及其子目录中的所有test_*.py 或 *_test.py格式的文件以及以test开头的方法或者class,不然就会提示找不到可以运行的case了。

1.运行后生成测试报告(htmlReport)

安装pytest-html:

pip install -U pytest-html

运行模式:

pytest --html=report.html

报告效果:

Python测试框架:pytest学习笔记

在以上报告中可以清晰的看到测试结果和错误原因,定位问题很容易。

2.运行指定的case

  当我们写了较多的cases时,如果每次都要全部运行一遍,无疑是很浪费时间的,通过指定case来运行就很方便了。

例子代码:

class TestClassOne(object):
 def test_one(self):
 x = "this"
 assert 't'in x
 
 def test_two(self):
 x = "hello"
 assert hasattr(x, 'check')
class TestClassTwo(object):
 def test_one(self):
 x = "iphone"
 assert 'p'in x
 
 def test_two(self):
 x = "apple"
 assert hasattr(x, 'check')

运行模式:

模式1:直接运行test_se.py文件中的所有cases:

pytest test_se.py

模式2:运行test_se.py文件中的TestClassOne这个class下的两个cases:

pytest test_se.py::TestClassOne

模式3:运行test_se.py文件中的TestClassTwo这个class下的test_one:

注意:定义class时,需要以T开头,不然pytest是不会去运行该class的。

3.多进程运行cases

  当cases量很多时,运行时间也会变的很长,如果想缩短脚本运行的时长,就可以用多进程来运行。

安装pytest-xdist:

pip install -U pytest-xdist

运行模式:

pytest test_se.py -n NUM

其中NUM填写并发的进程数。

4.重试运行cases

  在做接口测试时,有事会遇到503或短时的网络波动,导致case运行失败,而这并非是我们期望的结果,此时可以就可以通过重试运行cases的方式来解决。

安装pytest-rerunfailures:

pip install -U pytest-rerunfailures

运行模式:

pytest test_se.py --reruns NUM

NUM填写重试的次数。

5.显示print内容

  在运行测试脚本时,为了调试或打印一些内容,我们会在代码中加一些print内容,但是在运行pytest时,这些内容不会显示出来。如果带上-s,就可以显示了。

运行模式:

pytest test_se.py -s

另外,pytest的多种运行模式是可以叠加执行的,比如说,你想同时运行4个进程,又想打印出print的内容。

  可以用:

pytest test_se.py -s -n 4

以上就是Python测试框架:pytest学习笔记的详细内容,更多关于python pytest的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
Aug 05 Python
python的unittest测试类代码实例
Dec 07 Python
python通过微信发送邮件实现电脑关机
Jun 20 Python
Python爬虫之网页图片抓取的方法
Jul 16 Python
python机器学习之KNN分类算法
Aug 29 Python
python程序控制NAO机器人行走
Apr 29 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
Oct 14 Python
python科学计算之narray对象用法
Nov 25 Python
django API 中接口的互相调用实例
Apr 01 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
Feb 22 Python
分享python函数常见关键字
Apr 26 Python
如何快速一次性卸载所有python包(第三方库)呢
Oct 20 #Python
Python模块常用四种安装方式
Oct 20 #Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
Oct 20 #Python
编写python代码实现简单抽奖器
Oct 20 #Python
几款好用的python工具库(小结)
Oct 20 #Python
如何基于python实现年会抽奖工具
Oct 20 #Python
python使用re模块爬取豆瓣Top250电影
Oct 20 #Python
You might like
利用php获取服务器时间的实现代码
2013/06/07 PHP
javascript面向对象之Javascript 继承
2010/05/04 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
JS实现的简单下拉框联动功能示例
2018/05/11 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
举例区分Python中的浅复制与深复制
2015/07/02 Python
Python实现视频下载功能
2017/03/14 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
Python 实现递归法解决迷宫问题的示例代码
2020/01/12 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
python使用matplotlib绘制折线图的示例代码
2020/09/22 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
2020/10/15 Python
新加坡交友网站:be2新加坡
2019/04/10 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
Linux如何压缩可执行文件
2013/10/21 面试题
应届生简历中的自我评价
2014/01/13 职场文书
代办委托书怎么写
2014/08/01 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书
Python 匹配文本并在其上一行追加文本
2022/05/11 Python