第七:Pytes中的fixture大解剖(一)
1.简介
1.1.fixture是pytest的一个闪光点,pytest要精通怎么能不学习fixture呢?一起深入学习fixture吧。其实unittest和nose都支持fixture,但是pytest做得更炫。
1.2.fixture是pytest特有的功能,它用pytest.fixture标识,定义在函数前面。在你编写测试函数的时候,你可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将该函数的返回值作为测试函数的传入参数。fixture有明确的名字,在其他函数,模块,类或整个工程调用它时会被激活。
1.3.fixture是基于模块来执行的,每个fixture的名字就可以触发一个fixture的函数,它自身也可以调用其他的fixture。
1.4.我们可以把fixture看做是资源,在你的测试用例执行之前需要去配置这些资源,执行完后需要去释放资源。比如module类型的fixture,适合于那些许多测试用例都只需要执行一次的操作。
1.5.fixture提供了参数化功能,根据配置和不同组件来选择不同的参数。
1.6.fixture主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。比如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture就可以只做一次,否则每个测试用例都要做这两步也是冗余。
1.7.pytest提供的fixture实现unittest中setup/teardown 功能,可以在每次执行case之前初始化数据。不同点是,fixture可以只在执行某几个特定 case 前运行,只需要在运行case前调用即可,比setup/teardown使用起来更灵活。
1.8.如果想实现场景:用例1需要先登录,用例2不需要登录,用例3需要先登录。很显然这就无法用setup和teardown来实现了。
2.fixture用途。
2.1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现。
2.2.测试用例的前置条件可以使用fixture实现。
2.3.支持经典的xunit fixture ,像unittest使用的setup和teardown。
2.4.fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题。
3.fixture scope作用范围
3.1.先看下fixture函数的定义:使用装饰器标记fixture的功能 可以使用此装饰器(带或不带参数)来定义fixture功能。
3.2.fixture功能的名称可以在以后使用引用它会在运行测试之前调用它:test模块或类可以使用pytest.mark.usefixtures(fixturename标记), 在测试功能可以直接使用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>')”。
4.重点说下 scope 四组参数的意义:
4.1.function函数级:每个方法(函数)都会执行一次(不在类中)。
4.2.class类级:每个类都会执行一次。类中有多个方法调用,只在第一个方法调用时执行(在类中)。
4.3.module模块级:一个 .py 文件执行一次,一个.py 文件可能包含多个类和方法(不在类中)。
4.4.package/session级:多个文件调用一次,可以跨 .py 文件。
5.firture相对于setup和teardown有以下几点优势:
5.1.命名方式灵活,不局限于setup和teardown这几个命名。
5.2.conftest.py配置里可以实现数据共享,和firture配合使用,不需要import就能自动找到一些配置。
5.3.scope=”module” 可以实现多个.py跨文件共享前置。
5.4.scope=”session” 实现多个.py跨文件使用一个session来完成多个用例。
6.fixture定义:fixture通过@pytest.fixture()装饰器装饰一个函数,那么这个函数就是一个fixture。
7.例如这样的测试场景:
测试用例1:需要登录博客园,发布随笔
测试用例2:不需要登录博客园,浏览文章
测试用例3:需要登录博客园,删除随笔
7.1.把一个函数定义为fixture很简单,只能在函数声明之前加上@pytest.fixture,其他函数要来调用这个fixture,只用把它当做一个输入的参数即可。
7.2.如果@pytest.fixture()里面没有参数,那么默认scope=”function”,也就是此时的级别的function,针对函数有效。
7.3.fixture参数传入(scope=”function”)。
test_fix.py
#content of test_fix.pyimport pytest#不带参数时默认scope="function"
@pytest.fixture(scope='function')
def login():print("登录博客园")def test_1(login):print('测试用例1,登录博客园之后发布随笔111')def test_2():print('测试用例2,不需要登录博客园,浏览文章222')def test_3(login):print('测试用例2,登录博客园之后删除随笔333')
if __name__ == "__main__":pytest.main(["-s", "test_fix.py"])
7.4.运行结果:test_1和test_3运行之前都调用了login,也就是login执行了两次,fixture是每个测试用例如果调用了该fixture就会执行一次的。
8.conftest.py配置:
8.1.conftest.py配置脚本名称是固定的,不能改名称。
8.2.conftest.py与运行的用例要在同一个pakage下,并且有init.py文件。
8.3.不需要import导入conftest.py,pytest用例会自动查找。
8.4.由于上面的测试场景是在同一个.py文件中,多个用例调用一个登陆功能。此时如果有多个.py的文件都需要调用这个登陆功能的话,那就不能把登陆写到用例里面去了。此时应该要有一个配置文件,单独管理一些预置的操作场景,pytest里面默认读取conftest.py里面的配置。
8.5.conftest.py代码实现
#content of conftest.pyimport pytest#不带参数时默认scope="function"
@pytest.fixture(scope='function')
def login():print("登录博客园")
8.6.test_fix1.py代码实现
#content of test_fix1.pyimport pytestdef test_1(login):print('测试用例1,登录博客园之后发布随笔111')def test_2():print('测试用例2,不需要登录博客园,浏览文章222')def test_3(login):print('测试用例2,登录博客园之后删除随笔333')
if __name__ == "__main__":pytest.main(["-s", "test_fix1.py"])
8.7.运行结果
8.8.test_fix2.py代码实现
#content of test_fix2.pyimport pytestdef test_4(login):print('测试用例4,登录博客园之后修改头像444')def test_5():print('测试用例5,不需要登录博客园,浏览首页555')def test_6(login):print('测试用例6,登录博客园之后保存随笔666')
if __name__ == "__main__":pytest.main(["-s", "test_fix2.py"])
8.9.运行结果
8.10.单独运行test_fix1.py和test_fix2.py都能调用到login()方法,这样就能实现一些公共的操作可以单独拿出来了。
第七:Pytes中的fixture大解剖(一)相关推荐
- 第八:Pytes中的fixture大解剖(二)
test_fixture.py import pytest@pytest.fixture() def fixtureFunc():return 'fixtureFunc'def test_fixtur ...
- Maven学习总结(七)——eclipse中使用Maven创建Web项目
2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(七)--eclipse中使用Maven创建Web项目 一.创建Web项目 1.1 选择建立Maven Pr ...
- (转)Maven学习总结(七)——eclipse中使用Maven创建Web项目
孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(七)--eclipse中使用Maven创建Web项目 一.创建Web项目 1.1 选择建立Maven Project 选择File -& ...
- 区块链开发中的9大应用场景
区块链开发中的9大应用场景 自从2008年区块链技术的概念在中本聪的手里诞生以来,至今已有10年的历史.伴随着比特币市值的巨大波动,不管是男女老少都多多少少对区块链技术有过一定的了解.当很多人听到&q ...
- 谈马云创业人生中的十大苦难
马云的成功是很多人羡慕及向往的;也有不少人因各种原因指责唾骂的!乐晨也曾有一段时间因为听说阿里是日本商人孙正义的,认为他是在给日本人打工(没办法,痛恨日本人)心里不免骂他!但事后冷静后细想,如果那时国 ...
- 深度学习论文阅读目标检测篇(七)中英对照版:YOLOv4《Optimal Speed and Accuracy of Object Detection》
深度学习论文阅读目标检测篇(七)中英对照版:YOLOv4<Optimal Speed and Accuracy of Object Detection> Abstract 摘要 1. In ...
- iOS流布局UICollectionView系列七——三维中的球型布局
iOS流布局UICollectionView系列七--三维中的球型布局 发布时间: 2015/10/29 13:25 阅读: 1487 收藏: 23 点赞: 1 评论: 5 摘要 类似标签云的球状布局 ...
- 基于可视化 BI 工具 DataEase 制作第七次人口普查数据分析大屏
一.制作第七次人口普查数据大屏的背景介绍: 第七次人口普查刚刚结束,想要制作一个大屏,能够直观的看到人口总数.出生人数.死亡人数等的情况: 希望能够直观的看到人口分布的情况.各种比例.年龄结构等有一定 ...
- 战国七雄中最强大的国家(除秦外)——赵国
以下是在在网络上看到的一段讲赵国的文章,旁征博引,气势如虹,摘录如下: 赵国是战国七雄中最强大的国家,它是中国历史上最早建立大规模骑兵部队的国家,其士气之先进兵员之广也是空前的.赵一战杀匈奴十万骑,整 ...
最新文章
- 金山词霸2009牛津版
- IOS判断用户的网络类型(2/3/4G、wifi)
- MyBatis-10MyBatis注解方式之Provider注解
- Java基础 正则表达式 Pattern和Matcher
- 专题:数列信息传递问题转化为图论合点问题(ybtoj-数列询问+序列破解)
- 1057: [ZJOI2007]棋盘制作 - BZOJ
- 服务器部署docker
- Flutter FocusNode输入框焦点控制概述
- PHP实现今天是星期几的几种写法
- 机器学习基础:极大似然估计(Machine Learning Fundamentals: Maximum Likelihood Estimation)
- FIFO、LRU、LFU的含义和原理(转)
- Win7无法正常使用TTS语音的解决办法
- C语言标准库函数大全(ctype、time 、stdio、stdlib、math、string)
- C# AES填充加密解密
- java idle机制_Java培训:Tomcat中session的钝化与活化机制详解
- BZOJ.4340.[BJOI2015]隐身术(后缀数组 搜索)
- Python基础-电子邮件-初识
- 另一个jar包引不了_《嫌疑人X的献身》:一个天才的陨落
- 【LVS+Keepalived】 LVS+Keepalived实现tcp、udp负载均衡及HA高可用
- 计算机整个文稿应用回顾主题,计算机应用教案16.doc
热门文章
- Python xlwt : More than 4094 XFs (styles) 解决方法
- 经验备忘2014年01月
- HDU1029——Ignatius and the Princess IV
- [WPF]根据显示区域宽度裁剪字符串
- 注解描述(持续更新)
- Winform开发框架之通用高级查询模块--SNF快速开发平台3.3-Spring.Net.Framework
- VS2013 未找到与約束ContractName
- 用MVC做可拖拽的留言板,利用 Jquery模板 -- JsRender
- Notepad++没有插件管理器(Plugin Manager)的解决方法
- 解决css引用字体跨域问题