pytest-fixture的使用
2021-06-01 本文已影响0人
Chaweys
fixture可以让我们自定义测试用例的前置条件
fixture可以让我们自定义测试用例的前置条件
fixture命名方式灵活,不局限于 setup 和teardown 这几个命名
conftest.py 配置里可以实现数据共享,不需要 import 就能自动找到fixture
scope="module" 可以实现多个.py 跨文件共享前置
scope="session" 以实现多个.py 跨文件使用一个 session 来完成多个用例
举例:
@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
def test():
print("fixture初始化的参数列表")
fixture参数列表:
scope: fixture的作用域,默认:function,还有class、module、package、session四个【常用】
autouse:默认:False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixture
name: 默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name
注: session的作用域:是整个测试会话,即开始执行pytest到结束测试
测试用例如何调用fixture?
(1)、测试用例函数的入参传入fixture的名称
(2)、测试用例添加上装饰器 @pytest.mark.usefixtures(fixture_name)
(3)、定义fixture时设置参数autouse=True
知识点:
在类声明上面加 @pytest.mark.usefixtures() ,代表这个类里面所有测试用例都会调用该fixture
可以叠加多个 @pytest.mark.usefixtures() ,先执行的放底层,后执行的放上层
可以传多个fixture参数,先执行的放前面,后执行的放后面
如果fixture有返回值,用 @pytest.mark.usefixtures() 是无法获取到返回值的,必须用传参的方式(方式一)
#coding=utf-8
import pytest
@pytest.fixture() #定义第一个fixture,fixture_name=login
def login():
print("请先登录login1")
@pytest.fixture() #定义第二个fixture,fixture_name=login2
def login2():
print("请先登录login2")
#第一种调用fixture方式:fixture_name作为入参传入
def test_one(login):
print("测试test_one")
#第二种调用fixture方式:定义装饰器并传入fixture_name作为入参
@pytest.mark.usefixtures("login","login2")
def test_two():
print("测试test_two")
#第三种调用fixture方式:定义fixture为自动调用
@pytest.fixture(autouse=True)
def login3():
print("所有的测试用例都自动调用该login3")
if __name__ == '__main__':
pytest.main(["-s","test_fixture.py"])
结果:
test_fixture.py
所有的测试用例都自动调用该login3
请先登录login1
测试test_one
.所有的测试用例都自动调用该login3
请先登录login1
请先登录login2
测试test_two
.
fixture实现teardown后置条件操作
#fixture实现teardown操作,利用yield关键字来开启teardown操作
#coding=utf-8
import pytest
@pytest.fixture()
def login():
#测试用例方法的前置操作即setup
print("请登录")
name="账号"
pwd="密码"
age="年龄"
yield name,pwd,age #yield返回name,pwd,age
#测试用例方法的后置操作即teardown,由前面的yield关键字开启
print("登录结束")
def test_one(login): #测试用例方法传入fixture的name作为参数,调用fixture
print(login)
name,pwd,age=login #为何可以赋值?因为login函数由返回值yield定义的
assert "账号" in name
assert "密码" in pwd
assert "年龄" in age
if __name__ == '__main__':
pytest.main(["-s","test_fixture.py"])
结果:
test_fixture.py 请登录 【这是前置条件】
('账号', '密码', '年龄')
.登录结束 【这是后置条件】