源码注释:

def fixture(scope="function", params=None, autouse=False, ids=None, name=None):

 """这是一个标记工厂函数的装饰器.
不管是否带有参数,这个装饰器是用来定义一个fixture函数.
fixture函数的函数名被引用后,能够在运行测试用例前被调用:
测试模块或类可以使用pytest.marker.usefixtures(fixturename)来标记. 测试用例函数可以直接使用被装饰的fixture名称,作为测试函数的输入参数,在这种情况下,
fixture函数将返回一个fixture实例来注入测试用例函数,即作为入参传递。 fixture可以使用‘return’或者‘yield’语句来返回他们的值.使用‘yield’时,
‘yield’语句后的代码块将作为teardown代码执行,不管测试结果如何,必须只生成一次,
也就是说yield语句后的代码只有在最后一次调用后执行. :参数 scope: 共享scope范围的fixture, 有以下几种:
``"function"`` (默认), ``"class"``, ``"module"``,
``"session"``,``"package"``(实验中) . :参数 params: 一个可选的参数列表,能够使得fixture函数的多次调用和所有测试用例函数使用它. :参数 autouse: 如果为True,那么该fixture函数将被激活,所有测试对象都能使用;
如果为False,那么激活该fixture函数需要显式引用. :参数 ids: 字符串ids的列表,每个id对应着参数,以便于他们是测试id的一部分,
如果没有提供id,那么将由参数自动生成. :参数 name: fixture的名称,默认是被装饰的函数的名字.
如果一个fixture在同一个模块中被定义使用,那么该fixture的函数名将被请求fixture的函数参数隐藏.
解决此问题的方法是命名该装饰函数:
``fixture_<fixturename>````@pytest.fixture(name='<fixturename>')``.
"""

fixture的作用范围

    + fixture里面有个scope参数可以控制fixture的作用范围:session>module>class>function
+ -function:每一个函数或方法都会调用
+ -class:每一个类调用一次,一个类中可以有多个方法
+ -module:每一个.py文件调用一次,该文件内又有多个function和class
+ -session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
1.fixture为function级别的时候,它的作用范围是每个测试用例来之前运行一次,销毁代码在测试用例之后运行。
2.fixture为class级别的时候,如果一个class里面有多个用例,都调用了次fixture,那么此fixture只在此class里所有用例开始前执行一次。
3.fixture为module时,在当前.py脚本里面所有用例开始前只执行一次。
4.fixture为session级别是可以跨.py模块调用的,也就是当我们有多个.py文件的用例的时候,如果多个用例只需调用一次fixture,那就可以设置为scope="session",并且写到conftest.py文件里。

fixture的调用:

定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要以test开头,跟用例区分开。fixture是有返回值得,没有返回值默认为None。用例调用fixture的返回值,直接就是把fixture的函数名称当做变量名称。
例如:
import pytest
@pytest.fixture()
def test():
list1=[1,2,3,4,5,6]
return list1
def test_func(test):
print("传入的参数:"+str(test))
for i in test:
assert 1==i
输出:
============================ test session starts ==============================
test_fix-1.py 传入的参数:[1, 2, 3, 4, 5, 6]
@pytest.fixture()装饰器用于声明函数是一个fixture,如果测试函数的参数列表中包含fixture名,那么pytest会检测到,并在测试函数运行之前执行该fixture。fixture可以完成任务,也可以返回数据给测试函数。
建议:被fixture装饰的函数别以test命名,比如上面的命名为some_data,而不是test_data。当然,这样命名也没有错,只是为了方便区分是fixture还是测试用例(函数)

多个fixture调用:

    如果用例需要用到多个fixture的返回数据,fixture也可以返回一个元祖,list或字典,然后从里面取出对应数据。
import pytest
@pytest.fixture()
def data1():
list1=[1,2,3,4,5,6]
return list1
@pytest.fixture()
def data2():
list1=[3,4,5,6,7,8]
return list1
def test_func(data1,data2):
print("传入的参数:"+str(data1))
print("传入的参数:"+str(data2))
assert len(data1)==len(data2)
if __name__ == '__main__':
pytest.main["-s","test_fix-1.py"]
输出:
test_fix-1.py 传入的参数:[1, 2, 3, 4, 5, 6]
传入的参数:[3, 4, 5, 6, 7, 8]
.

conftest.py

    fixture可以放在单独的测试文件里,如果你希望多个测试文件共享fixture,可以在某个公共目录下新建一个conftest.py文件,将fixture放在其中。
如果你希望fixture的作用域仅限于某个测试文件,那么将它写在该测试文件里。可以供所在目录及其子目录下的测试使用。
说明:
尽管conftest.py是python模块,但它不能被当测试文件导入,import conftest的用法是不允许出现的。
例如:
conftest.py:
import pytest
@pytest.fixture()
def data_list():
return [1,2,3,4,5,6]
test_fix-1.py:
def test_func(data_list):
print("传入的参数:"+str(data_list))
assert len(data_list)==4
运行结果:test_fix-1.py 传入的参数:[1, 2, 3, 4, 5, 6]
当pytest执行test_func函数时,会自动去conftest.py里找data_list并执行,这样比如我们的用例,有些需要登录,有些不需要登录,我们可以给需要登录的用例加上fixture.

fixture配置及yield

     fixture会在测试函数之前运行,但如果fixture函数包含yield,那么系统会在yield处停止,转而执行测试函数,等测试函数执行完毕后再回到fixture,继续执行yield后面的代码。因此,可以将yield之前的代码视为配置(setup)过程,将yield之后的代码视为清理(teardown)过程,无论测试过程中发生了什么,yield之后的代码都会被执行
例如以下代码:
@pytest.fixture(scope="module")
def data_list():
print("打开浏览器,并且打开百度首页")
yield
print("执行teardown!")
print("最后关闭浏览器")
def test_func(data_list):
print("开始执行测试用例一")
def test_func1(data_list):
print("开始执行测试用例二")
输出结果:
test_fix-1.py 打开浏览器,并且打开百度首页
开始执行测试用例一
.开始执行测试用例二
.执行teardown!
最后关闭浏览器

--setup-show

    上面的运行结果中,没有具体看到执行结果,可以加入参数--setup-show查看具体执行过程,命令:pytest -s --setup-show test_fix-1.py

设置autouse=True

    平常写自动化用例会写一些前置的fixture操作,用例需要用到就直接传该函数的参数名称就行了。当用例很多的时候,每次都传这个参数,会比较麻烦。fixture里面有个参数autouse,默认是Fasle没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参了。
代码:
@pytest.fixture(scope="session",autouse=True)
def data_list():
print("打开浏览器,并且打开百度首页")
yield
print("执行teardown!")
print("最后关闭浏览器")

使用usefixture方法

    使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例
代码如下:
@pytest.mark.usefixtures("data_list")
def test_func():
print("开始执行测试用例一")
@pytest.mark.usefixtures("date_list")
def test_func1():
print("开始执行测试用例二")

pytest学习4-fixtures的更多相关文章

  1. [转载]pytest学习笔记

    pytest学习笔记(三)   接着上一篇的内容,这里主要讲下参数化,pytest很好的支持了测试函数中变量的参数化 一.pytest的参数化 1.通过命令行来实现参数化 文档中给了一个简单的例子, ...

  2. Pytest学习(三) - setup和teardown的使用

    一.前言 从文章标题可以看出,就是初始化和释放的操作,根据我的java习惯来学习pytest,个人感觉没差太多,理解上也不是很难. 哦,对了,差点跑题了,这个框架是基于Python语言的,在学习的时候 ...

  3. pytest学习笔记

    From: https://blog.csdn.net/gaowg11/article/details/54910974 由于对测试框架了解比较少,所以最近看了下pytest测试框架,对学习心得做个记 ...

  4. pytest学习笔记(三)

    接着上一篇的内容,这里主要讲下参数化,pytest很好的支持了测试函数中变量的参数化 一.pytest的参数化 1.通过命令行来实现参数化 文档中给了一个简单的例子, test_compute.py ...

  5. pytest学习笔记(二)

    继续文档的第二章 (一)pytest中可以在命令行中静态/动态添加option,这里没什么好讲的,略过... 这里面主要讲下如何试用skip/xfail,还有incremental(包含一些列的测试步 ...

  6. pytest学习笔记二 fixtrue

    前言 官方文档关于fixture功能的解释如下: The purpose of test fixtures is to provide a fixed baseline upon which test ...

  7. pytest 学习笔记一 入门篇

    前言 之前做自动化测试的时候,用的测试框架为Python自带的unittest框架,随着工作的深入,发现了另外一个框架就是pytest (官方地址文档http://www.pytest.org/en/ ...

  8. pytest学习笔记(一)

    这两天在学习pytest,之前有小用到pytest,觉得这个测试框架很灵巧,用在实现接口自动化(pytest+requests)非常的轻便,然后很有兴致的决定学习下,然后又发现了pytest-sele ...

  9. Pytest学习10-pytest与unittest的区别

    一.用例编写规则 1.unittest提供了test cases.test suites.test fixtures.test runner相关的类,让测试更加明确.方便.可控.使用unittest编 ...

  10. pytest学习5-mark用例分类

    使用Mark标记测试用例 通过使用pytest.mark你可以轻松地在测试用例上设置元数据.例如, 一些常用的内置标记: skip - 始终跳过该测试用例 skipif - 遇到特定情况跳过该测试用例 ...

随机推荐

  1. [Git:commit错误] Fatal: cannot do a partial commit during a merge

    注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 问题场景 今天进行Spring Boot版本升级,解决冲突后进行代码文件提交时出现这个错误. 上午 ...

  2. java设计模式学习笔记--接口隔离原则

    接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...

  3. nvm Nodejs 版本管理器 安装及配置

    1.如果已安装nodejs请先卸载干净 nodejs:删除C:\Program Files\nodejs 文件夹 npm:删除C:\Users\{用户名}\AppData\Roaming\npm 文件 ...

  4. AOV拓扑排序实验-2-AOV类的实现

    下面是这个类的实现代码: //这只是一个基本的框架,没有封装 #include<iostream> #include<cstdio> #include<malloc.h& ...

  5. lombok版本过低报错

    调试报错Error:java: java.lang.ExceptionInInitializerError  com.sun.tools.javac.code.TypeTags JAVA12调整原有项 ...

  6. Java-跳跃路线

    题目: 小明参加了学校的趣味运动会,其中的一个项目是:跳格子.地上画着一些格子,每个格子里写一个字,如下所示: 从我做起振我做起振兴做起振兴中起振兴中华 比赛时,先站在左上角的写着“从”字的格子里,可 ...

  7. C#浅拷贝与深拷贝测试

    1.浅拷贝与深拷贝 浅拷贝:只复制对象的基本类型,对象类型,仍属于原来的引用.       深拷贝:不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的. 2.浅拷贝与深拷贝的区别 ...

  8. mybatis及其与hibernate的对比

    1.mybatis是支持普通SQL查询.存储过程.和高级映射的优秀持久层框架 它消除了JDBC代码和参数的手工设置,以及对结果集的检索 2.mybatis使用简单的XML或注解用于配置和原始映射,将接 ...

  9. QS Network ZOJ - 1586 板子题

    #include<iostream> #include<algorithm> using namespace std; ; struct edge{ int a,b; doub ...

  10. JAVA是否最适合企业应用开发?

    · JAVA是否最适合企业应用开发? 当我刚入行做程序员的时候,那是在01-02年,铺天盖地的都是java,j2ee,公司也使用java作为开发语言,我也就随大流加入javaer阵营. 从那时起,各种 ...