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的Django框架中显示对象子集的方法
Jul 21 Python
redis之django-redis的简单缓存使用
Jun 07 Python
Pandas 按索引合并数据集的方法
Nov 15 Python
python对列进行平移变换的方法(shift)
Jan 10 Python
Python爬虫之UserAgent的使用实例
Feb 21 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
Aug 24 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
Python第三方库的几种安装方式(小结)
Apr 03 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
python如何对链表操作
Oct 10 Python
详解numpy1.19.4与python3.9版本冲突解决
Dec 15 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面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
PHP面向对象程序设计之类与反射API详解
2016/12/02 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
javascript 操作文件 实现方法小结
2009/07/02 Javascript
基于Jquery的温度计动画效果
2010/06/18 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
JavaScript中的style.display属性操作
2013/03/27 Javascript
jquery实现submit提交表单
2015/02/03 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
javascript自动恢复文本框点击清除后的默认文本
2016/01/12 Javascript
Javascript将数字转化成为货币格式字符串
2016/06/22 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
[49:35]KG vs SECRET 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
python字典键值对的添加和遍历方法
2016/09/11 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
Python pycharm 同时加载多个项目的方法
2019/01/17 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
python 实现音频叠加的示例
2020/10/29 Python
护士工作失误检讨书
2014/09/14 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
公司周年庆典致辞
2015/07/30 职场文书
周末问候语大全
2015/11/10 职场文书