pytest fixtures装饰器的使用和如何控制用例的执行顺序


Posted in Python onJanuary 28, 2021

pytest fixtures装饰器

pytest中可以使用@pytest.fixture 装饰器来装饰一个方法,被装饰方法的方法名可以作为一个参数传入到测试方法中。可以使用这种方式来完成测试之前的初始化,也可以返回数据给测试函数。

将fixture作为函数参数

通常使用setup和teardown来进行资源的初始化,如果有这样一个场景,测试用例1需要依赖登入功能,测试用例2不需要依赖登入功能,测试用例3需要登入功能,这种场景setup,teardown无法实现,也可以使用pytest fixture功能,在这个方法前面加个@pytest.fixture装饰器,加了这个装饰器的方法可以以参数的形式传到方法里,这个方法就会先执行这个登入方法,再去执行自身的用例步骤,如果没有传入这个登入方法就不执行登入操作,直接执行已有的步骤

#!/usr/bin/env python
# _*_coding: utf-8 _*_
import pytest


@pytest.fixture()
def login():
 print("这时一个登入的方法")
 return ('tome', '123')


@pytest.fixture()
def operate():
 print("这是登入后的操作")


def test_case1(login, operate):
 print(login)
 print("test_case1,需要登入")


def test_case2():
 print("test_case2,不需要登入")


def test_case3(login):
 print(login)
 print("test_case3,需要登入")

在上面的代码中,测试用例test_case1 和test_case3 分别增加了login 方法名作为参数,pytest会发现并调用@pytest.fixture标记的login功能,运行测试结果如下:

Testing started at 10:17 ...
C:\Python\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1\helpers\pycharm\_jb_pytest_runner.py" --path C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_fixture.py
Launching pytest with arguments C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_fixture.py in C:\Users\wanwen\PycharmProjects\vigo\xuexi\20210123
============================= test session starts =============================
platform win32 -- Python 3.8.0, pytest-5.4.3, py-1.9.0, pluggy-0.13.1
rootdir: C:\Users\wanwen\PycharmProjects\vigo\xuexi\20210123
plugins: html-2.1.1, metadata-1.11.0, ordering-0.6collected 3 items

test_fixture.py 这时一个登入的方法
这是登入后的操作
.('tome', '123')
test_case1,需要登入
.test_case2,不需要登入
这时一个登入的方法
.('tome', '123')
test_case3,需要登入
              [100%]

============================== 3 passed in 0.04s ==============================

Process finished with exit code 0

从上面结果可以看出,test_case1 和test_case3 运行之前执行了login方法,test_case2没有执行这个方法。

控制用例的执行顺序

一、pytest加载所有的用例都是乱序的,如果想指定用例的顺序,可以使用pytest-ordering插件,指定用例的执行顺序只需要在测试用例的方法前面加上装饰器@pytest.mark.run(order=[num])设置order的对应的num值,它就可以按照num的大小顺序来执行。

应用场景:有时运行测试用例要指定它的顺序,比如有些场景要先需要登入,才能执行后面的流程比如购物流程,下单流程,这时就需要指定用例的执行顺序。通过pytest-ordering这个插件可以完成用例顺序的指定。

二、安装

pip install pytest-ordering

三、实例

#!/usr/bin/env python
# _*_coding: utf-8 _*_
import pytest


class Testpytest(object):

  @pytest.mark.run(order=-1)
  def test_two(self):
    print("test_two, 测试用例")

  @pytest.mark.run(order=3)
  def test_one(self):
    print("test_one, 测试用例")

  @pytest.mark.run(order=1)
  def test_three(self):
    print("test_three, 测试用例")

四、运行结果

Testing started at 15:51 ...
C:\Python\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1\helpers\pycharm\_jb_pytest_runner.py" --path C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_order.py
Launching pytest with arguments C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_order.py in C:\Users\wanwen\PycharmProjects\vigo\xuexi\20210123
============================= test session starts =============================
platform win32 -- Python 3.8.0, pytest-5.4.3, py-1.9.0, pluggy-0.13.1
rootdir: C:\Users\wanwen\PycharmProjects\vigo\xuexi\20210123
plugins: html-2.1.1, metadata-1.11.0, ordering-0.6collected 3 items

test_order.py                             [100%]

============================== 3 passed in 0.06s ==============================

Process finished with exit code 0
.test_three, 测试用例
.test_one, 测试用例
.test_two, 测试用例

以上就是pytest fixtures装饰器的使用和如何控制用例的执行顺序的详细内容,更多关于pytest fixtures装饰器和控制用例的执行顺序的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
用Python实现一个简单的能够上传下载的HTTP服务器
May 05 Python
在Django的模型中执行原始SQL查询的方法
Jul 21 Python
Python简单实现TCP包发送十六进制数据的方法
Apr 16 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
Python设计模式之命令模式简单示例
Jan 10 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 Python
python实现五子棋小游戏
Mar 25 Python
Python逐行读取文件内容的方法总结
Feb 14 Python
基于python实现微信好友数据分析(简单)
Feb 16 Python
Python如何通过百度翻译API实现翻译功能
Apr 02 Python
2021年的Python 时间轴和即将推出的功能详解
Jul 27 Python
python blinker 信号库
May 04 Python
如何用tempfile库创建python进程中的临时文件
Jan 28 #Python
python基于Kivy写一个图形桌面时钟程序
Jan 28 #Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
Jan 28 #Python
详解Python调用系统命令的六种方法
Jan 28 #Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 #Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 #Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 #Python
You might like
php读取msn上的用户信息类
2008/12/05 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
JavaScript实现简单计算器功能
2019/12/19 Javascript
原生js实现文件上传、下载、封装等实例方法
2020/01/05 Javascript
JavaScript canvas实现雪花随机动态飘落
2020/02/08 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
2020/08/07 Javascript
vue-router 按需加载 component: () => import() 报错的解决
2020/09/22 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
Python异常处理知识点总结
2019/02/18 Python
Django数据统计功能count()的使用
2020/11/30 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
欧舒丹英国官网:购买欧舒丹护手霜等明星产品
2017/01/17 全球购物
Nº21官方在线商店:numeroventuno.com
2019/09/26 全球购物
如何将字串String转换成整数int
2015/02/21 面试题
服装设计师职业生涯规划范文
2014/02/28 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书