Pytest 使用简介
前言
最近在听极客时间的课程,里面的讲师极力推崇 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 使用简介相关推荐
- pytest fixture简介
pytest fixture简介 简介: fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进: 1.有独立的命名,并通过声明它们从测试函数.模块.类或整个项目 ...
- pytest使用简介
pytest是基于py unittest的一个单元测试框架,用起来比unittest简单不少,不过和unittest使用不太一样,总结如下: 格式: case的py文件名必须是test开头 def用例 ...
- pytest单元测试框架简介
一.什么是单元测试框架 单元测试框架是指:在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试. 二.单元测试框架的分类 Java: Juint.TestNG Python: unni ...
- python+pytest接口自动化之测试函数、测试类/测试方法的封装
前言 今天呢,笔者想和大家聊聊python+pytest接口自动化中将代码进行封装,只有将测试代码进行封装,才能被测试框架识别执行. 例如单个接口的请求代码如下: import requestshea ...
- pytest测试框架(一):初识pytest
一.pytest的简介 pytest是一个非常成熟的python的单元测试框架,比unittest更灵活,容易上手. pytest可以和selenium.request,appium结合实现web自动 ...
- pytest自动化测试框架,真正做到从0到1由浅入深详细讲解【万字级】
目录 嗨咯铁汁们,很久不见,我还是你们的老朋友凡叔,这里也感谢各位小伙伴的点赞和关注,你们的三连是我最大的动力哈,我也不会辜负各位的期盼,这里呢给大家出了一个pytest自动化测试框架由浅入深详细讲解 ...
- pytest.fixture()基础使用实例
目录 一.pytest.fixture()简介 二.scope参数 2.1简介特点 2.2scope=function 2.3scope=class 2.4scope=Module 2.5scope= ...
- Python测试框架pytest(01)简介、安装、快速入门
1.简介 pytest 是成熟的功能齐全的 Python 测试工具,可帮助你编写更好的程序. pytest 是一个使构建简单和可伸缩的测试变得容易的框架.测试具有表达性和可读性,不需要样板代码.几分钟 ...
- python测试4_Python 各种测试框架简介(四):pytest
pytest 有时也被称为 py.test,是因为它使用的执行命令是 $ py.test.本文中我们使用 pytest 指代这个测试框架,py.test 特指运行命令. ##较于 nose 这里没有使 ...
最新文章
- vscode:解决操作git总让输入用户名及密码问题
- 如何在Linux下写无线网卡的驱动
- vue 父组件传子组件数值,父值变更子获取的值没有变的问题
- java-回调机制详解
- 55 - I. 二叉树的深度
- 爬虫模拟登陆手机验证码_爬虫入门到精通-headers的详细讲解(模拟登录知乎)...
- 用十万级数据进行讲解MySQL索引基础
- 卷积神经网络多输入和多输出
- gradle——eclipse中安装与web项目创建
- MySQL 常用函数 日期和时间函数
- HTML5-打字游戏
- 数字ic后端学习ing
- qtdesigner设计表格_Qt Designer下的一些基础操作
- 你有必要不沾计算机一段时间英语,新目标英语八年级下第一单元知识点
- linux 关闭系统自动更新,Linux下如何关闭自动更新
- vue中关于生产evn.production 及开发evn.development 的环境配置说明
- vue父组件通过v-for循环多次调用同一个子组件,改变被循环数组个数,各子组件显示数据混乱
- 基于Java的地理位置定位系统
- 奔驰S400升级主动式氛围灯,大饼轮毂,4D旋转高音
- 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你
热门文章
- matlab 细化 去环,Matlab的memory模块消除代数环
- 手机访问个人电脑资源
- 一对一视频聊天软件源码,实现简单侧边栏弹出动画
- asp:Content ID=Content1 ContentPlaceHolderID=ContentPlaceHolder3Runat=Server/asp:Content是什么?
- 《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 6 章 答案
- Python3爬虫实战一之爬取网易云音乐热评
- 【软件外包】ITO与BPO
- pandas DataFrame applymap()函数
- 幽默感七个技巧_提升幽默感的3种方法
- 在weblogic中发布ejb需涉及到哪些配置文件