0
点赞
收藏
分享

微信扫一扫

【pytest-fixture】六、fixture通过yield或addfinalizer完成拆卸/清理

f12b11374cba 2022-04-13 阅读 45
python

目录

1.yield方式完成清理(推荐)

1.1介绍

使用yield的fixture和普通的fixture基本差不多,但还是有以下两点:

  • return改换成yield。
  • 需要做清理的代码写在yield的下面。

使用yield后,fixture的执行顺序是这样的,如有两个fixture函数,fixture1和fixture2,先由pytest计算出fixture的线性顺序,它将运行每个fxiture直到它返回,然后移动到列表中的下一个夹具做同样的事情。等待测试完成后,pytest将返回到fxiture列表,但顺序相反,如果开始先执行了fixture1再执行了fixture2,那么后面就是先执行fixture2在执行fixture1.

1.2代码示例

文件名:test_demo.py

import pytest


@pytest.fixture
def get_token():
    print("请求获取token")
    yield
    # 这里写你的清理代码
    print("注销token")


def test_demo():
    print("测试用例")

1.3运行结果

在这里插入图片描述

1.4结果分析

1.5举例说明多个yield的fixture执行顺序

  • 示例代码
    文件名: test_demo.py
import pytest


@pytest.fixture
def fn1():
    print("我是fn1,我在yield前面")
    yield 1
    print("我是fn1,我在yield后面")


@pytest.fixture
def fn2(fn1):
    print("我是fn2,我在yield前面")
    yield 2
    print("我是fn2,我在yield后面")


def test_demo(fn2):
    print("我是测试用例")
  • 运行结果
    在这里插入图片描述
  • 结果分析

1.6对于yield出错后的执行方式说明

还是通过代码和运行的方式进行说明

  • 实例代码
    文件名: test_demo.py
import pytest


@pytest.fixture
def fn1():
    print("我是fn1,我在yield前面")
    yield 1
    print("我是fn1,我在yield后面")


@pytest.fixture
def fn2(fn1):
    print("我是fn2,我在yield前面")
    1/0
    yield 2
    print("我是fn2,我在yield后面")


def test_demo(fn2):
    print("我是测试用例")
  • 运行结果
    在这里插入图片描述
  • 结果分析

2.使用addfinalizer方法完成清理

2.1介绍

2.2实例代码

文件名: test_demo.py

import pytest


@pytest.fixture
def login(request):
    print("登陆前置")

    def clear():
        print("登陆后置,清理代码")

    request.addfinalizer(clear)
    yield
    print("我是login yield的代码")


@pytest.fixture
def setup(login, request):
    print("前置代码")

    def clear():
        print("setup后置代码")

    request.addfinalizer(clear)
    yield
    print("后置代码")


def test_demo(setup):
    print("测试用例")

2.3运行结果

在这里插入图片描述

2.4结果分析

3.两种方式适用的场景

  • 代码示例
    文件名: test_demo.py
import pytest


@pytest.fixture
def login(request):
    print("登陆前置")

    def clear():
        print("登陆后置,清理代码")

    request.addfinalizer(clear)
    1/0
    yield
    print("我是login yield的代码")


def test_demo(login):
    print("测试用例")
  • 运行结果
    在这里插入图片描述
  • 结果分析
举报

相关推荐

0 条评论