pytest-fixture的使用

http://doc.pytest.org/en/latest/fixture.html

fixture的优点

显式、模块化、可扩展

  • fixture具有明确的名称,并通过从测试功能,模块,类或整个项目中声明它们的使用来激活。
  • fixture以模块化方式实现,因为每个fixture名称触发fixture功能,该fixture功能本身可以使用其他fixture。
  • fixture管理从简单的单元扩展到复杂的功能测试,允许根据配置和组件选项对夹具和测试进行参数化,或者在功能,类,模块或整个测试会话范围内重复使用夹具。

fixture作为函数参数

import pytest

@pytest.fixture(scope="session")
def start():
    print("fixture-start开始")
    
def test_3(start):
    print("结束")

执行结果:我们可以发现test_3被执行前 先执行了start方法

image.png

执行逻辑:
image.png

@pytest.fixture(scope="session")中我们我们写有scope="session",那么这个参数的作用是什么呢?这个我们在后面的【fixture的执行顺序控制】中讲到

fixture的模块化

在使用中如果发现需要使用多个文件中的fixture,则可以将fixture写入conftest.py中。
使用时不需要导入要在测试中使用的fixture,它会自动被pytest发现。

查找顺序:

fixture功能的发现从测试类开始,然后是测试模块,然后是 conftest.py文件,最后是内置和第三方插件

#conftest.py
import pytest

@pytest.fixture(scope="session")
def start():
    print("fixture-start开始")
#test_fixtures2.py
def test_3(start):
    print("结束")

执行结果一致

image.png

可以使用pytest --fixtures test_fixtures2.py查看可用的fixture

------------------- fixtures defined from test.conftest --------------------
topics
    conftest.py:11: no docstring available

start [session scope]
    conftest.py:7: no docstring available


===================== no tests ran in 0.02 seconds =========================

fixture的执行顺序控制

前面我们提到在@pytest.fixture(scope="session")中的scope参数,scope的作用是有多个fixture时指定优先级
scope从低到高优先级:function(默认)、class、module、package(实验,有风险)、session。

import pytest

# fixtures documentation order example
order = []

@pytest.fixture(scope="session")
def s1():
    order.append("s1")

@pytest.fixture(scope="module")
def m1():
    order.append("m1")

@pytest.fixture(scope="class")
def c1():
    order.append("c1")

@pytest.fixture()
def f3():
    order.append("f3")

class TestA():
    def test_order(self, c1, s1, m1,f3):
        print(order)
        assert order == ["s1", "m1", "c1", "f3"]

执行结果:我们可以发现执行顺序取决于fixture的scope传参
image.png
设置默认执行的fixture

对于所有test_方法都要使用的fixture,我们在定义fixture时可以使用autouse=True,就可以不传参了

@pytest.fixture()
def f3():
    order.append("f3")

@pytest.fixture(autouse=True)  #设置的默认执行
def a1():
    order.append("a1")

def test_1(f3):
    print(order)
    assert order == ["a1", "f3"]

执行结果:我们在test_1方法中没有传a1,但仍然执行了
image.png
fixture的嵌套

如果一个fixture执行前需要先执行另一个fixture,我们可以使用嵌套来解决

@pytest.fixture
def f1(f3):
    order.append("f1")

@pytest.fixture()
def f3():
    order.append("f3")

def test_1(f1):
    print(order)
    assert order == ["f3", "f1"]

执行结果:
image.png

fixture做后置处理yield

在pytest中我们有teardown_module之类的后置处理,fixture也可以支持相关操作

import pytest

@pytest.fixture()
def f1():
    print("f1")
    yield f1
    print("f1 后置处理")

class TestA():
    def test_1(self,f1):
        print("test_1")
        assert 2 == 1

可以看见在test_1()执行后,执行了yield后面的语句。且无论用例是否执行成功

image.png

  • 注意:如果我们使用有scope="class"的fixture,则会在类执行完成后进行后置处理,其他的scope参数也一样

通过request.module获取请求的module属性

@pytest.fixture(scope="module")
def smtp(request):
    server = getattr(request.module, "smtpserver")
    print(server)
    yield smtp
    pass

smtpserver = "mail.python.org"
class TestA():
    def test_showhelo(self,smtp):
        pass

执行结果:fixture通过request.module将smtpserver取了出来

image.png

官网说还可以将类属性取出来,但没找到关键字

fixture的参数化

需要使用params参数进行参数化,然后通过request.param取出

  • 单个参数的参数化
@pytest.fixture(params=['a', 'v', 'c'])
def fix(request):
    return request.param

def test_9(fix):
    print(fix)

执行结果:将三个参数依次取出
image.png
  • 多个参数的参数化----使用list
list = [{'a': '阿斯顿', 'b': '请问'},{'a': '自行车', 'b': '出现在'}]

@pytest.fixture(params=list)
def dic(request):
    return request.param

def test_2(dic):
    print('a=' + dic["a"])
    print('b=' + dic["b"])

执行结果:
image.png

另外fixture还支持mock
https://www.jianshu.com/p/4bd41d6bb2a9

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355