我基本上是跟着官网去学习fixture,自己先看并学了一遍,为了方便后续查看和记忆,所以将学习笔记记录下来,如果有不对的地方,欢迎大家评论区指出。
1.fxitrue自动执行(无需请求)
1.1介绍
官方话术: 有时你可能想要一个你知道所有测试都依赖的夹具(甚至几个)。“自动使用”fixture 是一种让所有测试自动请求它们的便捷方式。这可以减少很多多余的请求,甚至可以提供更高级的夹具使用(更多的是进一步的)。 我们可以通过传入夹具的装饰器使夹具成为自动使用autouse=True的夹具。
自我理解: 如果你有的数据需要逻辑处理,先执行,为了减少很多次多余的请求,可以试试自动执行.
1.2代码示例
文件名: test_demo.py
import pytest
@pytest.fixture
def login():
return 'token'
@pytest.fixture
def driver():
return 'driver'
@pytest.fixture
def data():
return []
# autouse=True: 设置自动执行
@pytest.fixture(autouse=True)
def setup(login, driver, data):
data.append(login)
data.append(driver)
def test_demo(data):
assert data == ["token", "driver"]
1.3运行结果
1.4结果分析
上述代码中,如果setup没有自动运行,那么我们通过data获得的结果就是[],但是明显我们断言成功了,说明获得的结果就是[‘token’, ‘driver’],这证明了我们setup自动执行了.
这里可能大家会说data返回的不是[]吗?为什么会是有值的,因为之前说过,fixture在作用域期间只会执行一次,它的返回值会被缓存,所以缓存的值就是[],在运行setup时给他追加了两个元素,所以它的值就是[“token”, “driver”],列表追加值是不会改变原来的地址空间值的,所以我们在去调用data时就是返回追加结果后的值.
所以我们的fixtrue支持自动执行,看你需要它具体去完成什么在使用.
2.使用标记将数据传递给fixtrue
2.1介绍
官方话术: 使用该request对象,夹具还可以访问应用于测试功能的标记。这对于将数据从测试传递到夹具中很有用
自我理解: 我们可以通过标记把想要传递的值传递到fixture中,根据参数的不同,返回不同的值,在具体场景中,这很有用
2.2代码示例
文件名: test_demo.py
import pytest
@pytest.fixture
def login(request):
# 这里传递的字符串,必须与mark后面的自定义名称一致,否则无法获取
marker = request.node.get_closest_marker("login")
if marker is None:
data = None
else:
data = marker.args[0]
return data
# mark后面的login是支持自定义的
@pytest.mark.login("token")
def test_demo(login):
assert login == 'token'
2.3运行结果
2.结果分析
通过上述例子,我们可以通过传递不同的值,去让fixtrue返回不同的值,这在一些具体场景很有用
不过要注意的是,@pytest.mark.login(),login是可以随便写的(自定义),后面括号是你要传递的值,然后你在接收时,你要使用request(这个在后面会讲到,这里知道怎么用就行).node.get_closest_marker(‘login’)去获取,但是里面传递的字符串必须和mark后面自定义的名称一致,否则无法取出值.