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实现的下载8000首儿歌的代码分享
Nov 21 Python
python交互式图形编程实例(三)
Nov 17 Python
TensorFlow搭建神经网络最佳实践
Mar 09 Python
python之从文件读取数据到list的实例讲解
Apr 19 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
opencv转换颜色空间更改图片背景
Aug 20 Python
Series和DataFrame使用简单入门
Nov 13 Python
PyCharm下载和安装详细步骤
Dec 17 Python
使用pytorch和torchtext进行文本分类的实例
Jan 08 Python
python、PyTorch图像读取与numpy转换实例
Jan 13 Python
Python实现http接口自动化测试的示例代码
Oct 09 Python
python前后端自定义分页器
Apr 13 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可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
2014/07/05 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
JavaScript建立一个语法高亮输入框实现思路
2013/02/26 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
JavaScript 处理树数据结构的方法示例
2019/06/16 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
JavaScript进制转换实现方法解析
2020/01/18 Javascript
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
Python 文件重命名工具代码
2009/07/26 Python
python实现删除文件与目录的方法
2014/11/10 Python
Python增量循环删除MySQL表数据的方法
2016/09/23 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
英国打印机墨水和碳粉商店:Printerinks
2017/06/30 全球购物
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
计算机网络专业求职信
2014/06/05 职场文书
正规欠条模板
2015/07/03 职场文书
学术会议领导致辞
2015/07/29 职场文书