Pytest测试框架基本使用方法详解


Posted in Python onNovember 25, 2020

pytest介绍

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

1、简单灵活,容易上手,文档丰富;

2、支持参数化,可以细粒度地控制要测试的测试用例;

3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);

4、pytest具有很多第三方插件,并且可以自定义扩展

  • 如pytest-selenium(集成selenium)、
  • pytest-html(完美html测试报告生成)、
  • pytest-rerunfailures(失败case重复执行)、
  • pytest-xdist(多CPU分发)、
  • pytest--ordering(控制测试运行的顺序)

5、测试用例的skip和xfail处理;

6、可以很好的和CI工具结合,例如jenkins

编写规则:

  • 测试文件以test_开头(以_test结尾也可以)
  • 测试类以Test开头,并且不能带有 init 方法
  • 测试函数以test_开头

断言使用基本的assert即可

快速示例

test_pyexample.py

import pytest

class TestClass:
    def test_one(self):
      x = "this"
      assert 'h' in x

    def test_two(self):
      x = "hello"
      assert hasattr(x, 'check')

    def test_three(self):
      a = "hello"
      b = "hello world"
      assert a in b

通过命令行运行:

1、cd 到代码所在的目录,执行命令:py.test test_pyexample.py

2、安装pytest-sugar插件可以看到进度条

Pycharm配置运行:

1.file->Setting->Tools->Python Integrated Tools->项目名称->Default test runner->选择py.test

import pytest

class TestClass:
    def test_one(self):
      x = "this"
      assert 'h' in x

    def test_two(self):
      x = "hello"
      assert hasattr(x, 'check')

    def test_three(self):
      a = "hello"
      b = "hello world"
      assert a in b

if __name__ == "__main__":
  pytest.main('-q test_class.py')

Console常用参数介绍:

  • -v 用于显示每个测试函数的执行结果
  • -q 只显示整体测试结果
  • -s 用于显示测试函数中print()函数输出
  • -x, --exitfirst, exit instantly on first error or failed test
  • -m 只运行带有装饰器配置的测试用例
  • -h 帮助
py.test # run all tests below current dir
py.test test_mod.py # run tests in module file test_mod.py
py.test somepath # run all tests below somepath like ./tests/
py.test -k stringexpr # only run tests with names that match the
# the "string expression", e.g. "MyClass and not method"
# will select TestMyClass.test_something
# but not TestMyClass.test_method_simple
py.test test_mod.py::test_func # only run tests that match the "node ID",
# e.g "test_mod.py::test_func" will be selected
# only run test_func in test_mod.py

pytest参数化

使用装饰器:@pytest.mark.parametrize()

单个参数:

import pytest
import random
@pytest.mark.parametrize('x',[(1),(2),(6)])
def test_add(x):
  print(x)
  assert x==random.randrange(1,7)

多个参数:

import pytest
@pytest.mark.parametrize('x,y',[
  (1+2,3),
  (2-0,1),
  (6*2,12),
  (10*2,3),
  ("test","test"),
])
def test_add(x,y):  #必须与上面保持一致,只能用x,y不能用其他字母
  assert x==y

控制测试运行顺序

安装pytest-ordering

pip install pytest-ordering

借助于装饰器@pytest.mark.run(order=1)控制测试运行的顺序

import pytest
import time
value=0
@pytest.mark.run(order=2) #后执行order=2
def test_add2():
  print("I am 2")
  time.sleep(2)
  assert value==10
@pytest.mark.run(order=1)  #先执行order=1
def test_add():
  print("I am add")
  global value
  value=10
  assert value==10

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

安装pytest-html:

pip install -U pytest-html

如何使用:

py.test test_pyexample.py --html=report.html

更详细的测试报告

安装 pytest-cov:

pip install pytest-cov

如何使用

py.test --cov-report=html --cov=./ test_code_target_dir
Console参数介绍
--cov=[path], measure coverage for filesystem path (multi-allowed), 指定被测试对象,用于计算测试覆盖率
--cov-report=type, type of report to generate: term, term-missing, annotate, html, xml (multi-allowed), 测试报告的类型
--cov-config=path, config file for coverage, default: .coveragerc, coverage配置文件
--no-cov-on-fail, do not report coverage if test run fails, default: False,如果测试失败,不生成测试报告
--cov-fail-under=MIN, Fail if the total coverage is less than MIN. 如果测试覆盖率低于MIN,则认为失败

多进程运行

安装pytest-xdist:

pip install -U pytest-xdist

如何使用:

py.test test_pyexample.py -n NUM

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

重新运行失败的用例

安装pytest- rerunfailures:

import random
def add(x,y):
  return x+y
def test_add():
  random_value=random.randint(2,7)
  print('random_value:'+str(random_value))
  assert add(1,3)==random_value

如何使用:

命令:pytest --reruns 重试次数

比如:pytest --reruns 3

表示:运行失败的用例可以重新运行3次

命令:pytest --reruns 重试次数 --reruns-delay 次数之间的延时设置(单位:秒)

比如:pytest --reruns 3 --reruns-delay 5

表示:(译:瑞软四、地类)运行失败的用例可以重新运行3次,第一次和第二次的间隔时间为5秒钟

另外也可以通过装饰器的方式配置:

@pytest.mark.flaky(reruns=3, reruns_delay=5)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python struct.unpack
Sep 06 Python
pycharm在调试python时执行其他语句的方法
Nov 29 Python
Python进阶之@property动态属性的实现
Apr 01 Python
python生成requirements.txt的两种方法
Sep 18 Python
Python猴子补丁知识点总结
Jan 05 Python
Python开发之基于模板匹配的信用卡数字识别功能
Jan 13 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
Feb 07 Python
Python操作dict时避免出现KeyError的几种解决方法
Sep 20 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
Nov 29 Python
Python+kivy BoxLayout布局示例代码详解
Dec 28 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
Feb 06 Python
只用20行Python代码实现屏幕录制功能
Jun 02 Python
python实现企业微信定时发送文本消息的实例代码
Nov 25 #Python
Python json解析库jsonpath原理及使用示例
Nov 25 #Python
搭建pypi私有仓库实现过程详解
Nov 25 #Python
Python代码覆盖率统计工具coverage.py用法详解
Nov 25 #Python
python 实时调取摄像头的示例代码
Nov 25 #Python
Python存储读取HDF5文件代码解析
Nov 25 #Python
python 简单的调用有道翻译
Nov 25 #Python
You might like
php array_walk() 数组函数
2011/07/12 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
JS实现鼠标滑过链接改变网页背景颜色的方法
2015/10/20 Javascript
jquery自适应布局的简单实例
2016/05/28 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
jQuery实现的tab标签切换效果示例
2016/09/05 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
Web前端框架Angular4.0.0 正式版发布
2017/03/28 Javascript
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
vue购物车插件编写代码
2017/11/27 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
原生实现一个react-redux的代码示例
2018/06/08 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
2019/05/16 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
在Django的视图(View)外使用Session的方法
2015/07/23 Python
python实现应用程序在右键菜单中添加打开方式功能
2017/01/09 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
Python爬虫实例——爬取美团美食数据
2020/07/15 Python
降低python版本的操作方法
2020/09/11 Python
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
2012/10/20 HTML / CSS
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
送餐员岗位职责范本
2014/02/21 职场文书
廉洁校园实施方案
2014/05/25 职场文书
记账会计岗位职责
2014/06/16 职场文书
我的中国梦主题教育活动总结
2015/05/07 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis