【pytest-fixture】三、一个测试或fixture请求多个fixture和fixture在作用域期间只执行一次(返回值被缓存)

我基本上是跟着官网去学习fixture,自己先看并学了一遍,为了方便后续查看和记忆,所以将学习笔记记录下来,如果有不对的地方,欢迎大家评论区指出。

1. 一个测试或fixture请求多个fixture

1.1介绍

官方话术: 测试用例和fixture不限于一次请求一个fixture。他们可以请求多个fixture。
自我理解: 测试用例和fixture可以同时请求多个fixture

1.2代码示例

测试文件: test_demo.py

import pytest


@pytest.fixture
def login():
    return "token"


@pytest.fixture
def get_driver():
    return "driver"


# 一个fixture可以请求多个fixture
@pytest.fixture
def setup(login, get_driver):
    return login + ":" + get_driver


@pytest.fixture
def teardown():
    return "clear"


# 一个测试可以请求多个fixture
def test_demo(setup, teardown):
    assert setup == "token:driver"
    assert teardown == "clear"

运行代码:
在这里插入图片描述
结果分析:

两个断言成功了,且没有报错,说明一个fixtrue或测试是可以请求多个fixtrue的

1.3小结

通过例子,我们可以看出一个fixture或测试可以请求多个fixtrue,这就像我们一个类继承多个类一样,可以让我们的fixture功能跟多样化,可以拆分的更细,提高我们的fixture可重用性。

2.fixture在作用域期间只执行一次(返回值被缓存)

2.1介绍

官方话术: 在同一个测试期间,也可以多次请求夹具,并且 pytest 不会为该测试再次执行它们。这意味着我们可以在依赖于它们的多个固定装置中请求 固定装置(甚至在测试本身中再次请求固定装置),而无需多次执行这些固定装置。
自我理解: 同一个fixture可以被一个多次请求,但在作用域期间只会执行一次(返回值被缓存),后续就直接去拿值了,而不会再去执行一次了。

2.2代码示例

文件名:test_demo.py

import pytest


@pytest.fixture
def login():
    print("我被执行了")
    return "token"


@pytest.fixture
def setup(login):
    return [login]


def test_demo(setup, login):
    assert setup == [login]

运行代码:
在这里插入图片描述
结果分析:

通过结果,我们可以看到"我被执行了"只打印了一次,但是我们却调用了两次login,一次是调用setup时,setup去调用login,第二次是直接调用login,但只打印了一次,说明我们的login函数在function的作用域期间只执行了一次.
虽然我们的login只执行了一次,但是第二次获取login的值时,login仍然返回了’token’,如果没有返回’token’,我们的断言就会失败,所以fixture虽然在作用域期间只执行一次,但是它的返回值是会被珲缓存的.

2.3小结

通过上述示例,我们能看出fixtrue可以被多次访问,但在作用域期间只会执行一次,且会将返回值缓存,下次请求直接返回值而不执行代码.

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个示例代码框架,使用了 `conftest` 和 `pytest fixture`,并实现了不同作用域的变量使用: conftest.py ```python import pytest # session 级别的 fixture,作用域为整个测试会话 @pytest.fixture(scope='session') def session_fixture(): print('session fixture setup') yield print('session fixture teardown') # module 级别的 fixture,作用域为当前测试模块 @pytest.fixture(scope='module') def module_fixture(): print('module fixture setup') yield print('module fixture teardown') # function 级别的 fixture,作用域为每个测试函数 @pytest.fixture(scope='function') def function_fixture(): print('function fixture setup') yield print('function fixture teardown') ``` test_example.py ```python def test_one(session_fixture, module_fixture, function_fixture): print('test one') def test_two(session_fixture, module_fixture, function_fixture): print('test two') ``` 在上面的代码中,我们定义了个不同作用域fixture,分别是 `session_fixture`、`module_fixture` 和 `function_fixture`。在 `test_example.py` 中,我们使用了这fixture,每个测试函数都会执行fixture,且每个 fixture 的作用域不同。 如果我们执行 `pytest test_example.py` 命令,输出如下: ``` session fixture setup module fixture setup function fixture setup test one function fixture teardown function fixture setup test two function fixture teardown module fixture teardown session fixture teardown ``` 可以看到,`session_fixture` 在整个测试会话中只会执行一次,在测试开始前和结束后分别执行了 `session_fixture setup` 和 `session_fixture teardown`。`module_fixture` 在每个测试模块中执行一次,在测试模块开始前和结束后分别执行了 `module_fixture setup` 和 `module_fixture teardown`。`function_fixture` 在每个测试函数中执行一次,在每个测试函数开始前和结束后分别执行了 `function_fixture setup` 和 `function_fixture teardown`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值