我基本上是跟着官网去学习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可以被多次访问,但在作用域期间只会执行一次,且会将返回值缓存,下次请求直接返回值而不执行代码.