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 请登录        【这是前置条件】
('账号', '密码', '年龄')
.登录结束                     【这是后置条件】
上一篇下一篇

猜你喜欢

热点阅读