前言

  最近在听极客时间的课程,里面的讲师极力推崇 pytest 框架,鄙视 unittest 框架,哈哈!然后查了些资料,发现了一条 python 鄙视链:pytest 鄙视 > unittest 鄙视 >  robotframework 。

  pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效,支持315种以上的插件,同时兼容 unittest 框架。这就使得我们在 unittest 框架迁移到 pytest 框架的时候不需要重写代码。接下来我们在文中来对分析下 pytest 有哪些简洁、高效的用法。

一、安装

首先使用 pip 安装 pytest

pip3 install pytest

查看 pytest 是否安装成功

pip3 show pytest

二、简单使用

1.创建 test_sample.py 文件,代码如下:

#!/usr/bin/env python
# coding=utf-8
import pytestdef inc(x):return x + 1def test_answer():assert inc(3) == 5if __name__ =="__main__":pytest.main()

执行结果:

test_sample.py F                                                         [100%]================================== FAILURES ===================================
_________________________________ test_answer _________________________________def test_answer():
>       assert inc(3) == 5
E       assert 4 == 5
E        +  where 4 = inc(3)test_sample.py:19: AssertionError
============================== 1 failed in 0.41s ==============================

从上面的例子可以看出,pytest 中断言的用法直接使用 assert ,和 unittest 中断言 self.assert 用法有所区别。

2.总结一下:使用 pytest 执行测试需要遵行的规则:

  • .py 测试文件必须以test_开头(或者以_test结尾)

  • 测试类必须以Test开头,并且不能有 init 方法

  • 测试方法必须以test_开头

  • 断言必须使用 assert

3.pytest.ini 配置文件

[pytest]
addopts = -v -s --html=py_test/scripts/report/report.html -p no:warnings  --reruns=10
testpaths = ./py_test/scripts
python_files= test_rerun.py
python_classes = Test*
python_function = test*
xfail_strict = true

4.addopts: OPTS 命令行参数集

-s:表示输出调试信息,包括 print打印的信息
-v:显示更详细的信息
-vs:这两个参数一起用
-n :支持多线程或者分布式运行测试用例
     如:pytest -vs ./testcase/test_login.py -n 2
--html : 测试报告位置
--reruns :失败重跑
-p no:warnings  :取消警告
--ff :先执行上次失败的用例
--lf :只执行上次失败的用例
-x :遇到测试用例fail,就结束测试
--maxfail=num:遇到num条测试用例fail, 就结束测试 
-k :根据测试用例的部分字符串指定测试用例
如:pytest -vs ./testcase -k “ao”

三、fixture

pytest 提供的 fixture 实现 unittest  中 setup/teardown 功能,可以在每次执行case之前初始化数据。不同点是,fixture 可以只在执行某几个特定 case 前运行,只需要在运行 case 前调用即可。比 setup/teardown 使用起来更灵活。

1.fixture scope 作用范围

先看下 fixture 函数的定义:

def fixture(scope="function", params=None, autouse=False, ids=None, name=None):""":arg scope:    可选四组参数:function(默认)、calss、module、package/session:arg params:   一个可选的参数列表,它将导致多个参数调用fixture函数和所有测试使用它。:arg autouse:  如果为True,则fixture func将为所有测试激活可以看到它。如果为False(默认值),则需要显式激活fixture。:arg ids:      每个参数对应的字符串id列表,因此它们是测试id的一部分。如果没有提供id,它们将从参数中自动生成。:arg name:     fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽; 解决这个问题的一种方法是将装饰函数命名 “fixture_ <fixturename>”然后使用”@ pytest.fixture(name ='<fixturename>')”。"""

重点说下 scope 四组参数的意义:

  • function:每个方法(函数)都会执行一次。

  • class:每个类都会执行一次。类中有多个方法调用,只在第一个方法调用时执行。

  • module:一个 .py 文件执行一次。一个.py 文件可能包含多个类和方法。

  • package/session:多个文件调用一次,可以跨 .py 文件。

在所需要调用的函数前面加个装饰器 @pytest.fixture()。举一个简单的例子:

#!/usr/bin/env python
# coding=utf-8
import pytest@pytest.fixture(scope='function')
def login():print("登录")def test_1():print('测试用例1')def test_2(login):print('测试用例2')if __name__ =="__main__":pytest.main(['test_sample.py','-s'])

执行结果:

test_sample.py 测试用例1
.
登录
测试用例2
.============================== 2 passed in 0.07s ==============================

2.yield

我们刚刚实现了在每个用例之前执行初始化操作,那么用例执行完之后如需要 清除数据(或还原)操作,可以使用 yield 来实现。

#!/usr/bin/env python
# coding=utf-8
import pytest@pytest.fixture(scope='function')
def login():print("登录")yieldprint("注销登录")def test_1():print('测试用例1')def test_2(login):print('测试用例2')if __name__ =="__main__":pytest.main(['test_sample.py','-s'])

执行结果:

test_sample.py
测试用例1
.
登录
测试用例2
.注销登录============================== 2 passed in 0.08s ==============================

3.conftest

上面的案例都是写在同一个.py 文件内的。倘若有多个.py 文件需要调用 login() 方法,就必须把 login() 方法写在外面,这里引用了conftest.py 配置文件。test_xxx.py 测试文件中无需 import  conftest,pytest 会自动搜索同级目录中的 conftest.py 文件。

conftest.py 与 测试文件 目录层级关系

# 新建conftest.py,和 test_sample.py 同级目录
import pytest@pytest.fixture(scope='function')
def login():print("登录")# test_sample.py 代码如下
import pytestdef test_1():print('测试用例1')def test_2(login):print('测试用例2')if __name__ =="__main__":pytest.main(['test_sample.py','-s'])

执行结果:

test_sample.py
测试用例1
.
登录
测试用例2
.============================== 2 passed in 0.01s ==============================

四、重试机制

有的时候用例执行失败了,然后排查发现不是代码问题,可能和环境或者网络不稳定有关系,这个时候可以引入重试机制,排除一些外在因素。

1、安装 pytest-rerunfailures

pip3 install pytest-rerunfailures

2、重试的两种方法

1)使用装饰器 @pytest.mark.flaky(reruns=5, reruns_delay=2)

  • reruns :最大重试次数
  • reruns_delay :重试间隔时间,单位是秒
#!/usr/bin/env python
# coding=utf-8
import pytest@pytest.mark.flaky(reruns=5, reruns_delay=2)
def test():assert 0==1if __name__ =="__main__":pytest.main(['test_sample.py','-s'])

R表示用例失败后正在重试,尝试5次。

2)也可以使用命令行 pytest --reruns 5 --reruns-delay 2 -s ,参数与装饰器 @pytest.mark.flaky 一致,这个就不多说了。

Pytest 使用简介相关推荐

  1. pytest fixture简介

    pytest fixture简介 简介: fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进: 1.有独立的命名,并通过声明它们从测试函数.模块.类或整个项目 ...

  2. pytest使用简介

    pytest是基于py unittest的一个单元测试框架,用起来比unittest简单不少,不过和unittest使用不太一样,总结如下: 格式: case的py文件名必须是test开头 def用例 ...

  3. pytest单元测试框架简介

    一.什么是单元测试框架 单元测试框架是指:在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试. 二.单元测试框架的分类 Java: Juint.TestNG Python: unni ...

  4. python+pytest接口自动化之测试函数、测试类/测试方法的封装

    前言 今天呢,笔者想和大家聊聊python+pytest接口自动化中将代码进行封装,只有将测试代码进行封装,才能被测试框架识别执行. 例如单个接口的请求代码如下: import requestshea ...

  5. pytest测试框架(一):初识pytest

    一.pytest的简介 pytest是一个非常成熟的python的单元测试框架,比unittest更灵活,容易上手. pytest可以和selenium.request,appium结合实现web自动 ...

  6. pytest自动化测试框架,真正做到从0到1由浅入深详细讲解【万字级】

    目录 嗨咯铁汁们,很久不见,我还是你们的老朋友凡叔,这里也感谢各位小伙伴的点赞和关注,你们的三连是我最大的动力哈,我也不会辜负各位的期盼,这里呢给大家出了一个pytest自动化测试框架由浅入深详细讲解 ...

  7. pytest.fixture()基础使用实例

    目录 一.pytest.fixture()简介 二.scope参数 2.1简介特点 2.2scope=function 2.3scope=class 2.4scope=Module 2.5scope= ...

  8. Python测试框架pytest(01)简介、安装、快速入门

    1.简介 pytest 是成熟的功能齐全的 Python 测试工具,可帮助你编写更好的程序. pytest 是一个使构建简单和可伸缩的测试变得容易的框架.测试具有表达性和可读性,不需要样板代码.几分钟 ...

  9. python测试4_Python 各种测试框架简介(四):pytest

    pytest 有时也被称为 py.test,是因为它使用的执行命令是 $ py.test.本文中我们使用 pytest 指代这个测试框架,py.test 特指运行命令. ##较于 nose 这里没有使 ...

最新文章

  1. vscode:解决操作git总让输入用户名及密码问题
  2. 如何在Linux下写无线网卡的驱动
  3. vue 父组件传子组件数值,父值变更子获取的值没有变的问题
  4. java-回调机制详解
  5. 55 - I. 二叉树的深度
  6. 爬虫模拟登陆手机验证码_爬虫入门到精通-headers的详细讲解(模拟登录知乎)...
  7. 用十万级数据进行讲解MySQL索引基础
  8. 卷积神经网络多输入和多输出
  9. gradle——eclipse中安装与web项目创建
  10. MySQL 常用函数 日期和时间函数
  11. HTML5-打字游戏
  12. 数字ic后端学习ing
  13. qtdesigner设计表格_Qt Designer下的一些基础操作
  14. 你有必要不沾计算机一段时间英语,新目标英语八年级下第一单元知识点
  15. linux 关闭系统自动更新,Linux下如何关闭自动更新
  16. vue中关于生产evn.production 及开发evn.development 的环境配置说明
  17. vue父组件通过v-for循环多次调用同一个子组件,改变被循环数组个数,各子组件显示数据混乱
  18. 基于Java的地理位置定位系统
  19. 奔驰S400升级主动式氛围灯,大饼轮毂,4D旋转高音
  20. 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你

热门文章

  1. matlab 细化 去环,Matlab的memory模块消除代数环
  2. 手机访问个人电脑资源
  3. 一对一视频聊天软件源码,实现简单侧边栏弹出动画
  4. asp:Content ID=Content1 ContentPlaceHolderID=ContentPlaceHolder3Runat=Server/asp:Content是什么?
  5. 《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 6 章 答案
  6. Python3爬虫实战一之爬取网易云音乐热评
  7. 【软件外包】ITO与BPO
  8. pandas DataFrame applymap()函数
  9. 幽默感七个技巧_提升幽默感的3种方法
  10. 在weblogic中发布ejb需涉及到哪些配置文件