fixture的优势
- 命名方式灵活,不局限于 setup 和teardown 这几个命名
- conftest.py 配置里可以实现数据共享,不需要 import 就能自动找到fixture
- scope=“module” 可以实现多个.py 跨文件共享前置
- scope=“session” 以实现多个.py 跨文件使用一个 session 来完成多个用例
Fixture参数列表
@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
def test():
print("fixture====")
- scope:可以理解成fixture的作用域,默认:function,还有class、module、package、session四个【常用】
- autouse:默认:False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixture
- name:默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name
注意 session的作用域:是整个测试会话,即开始执行pytest到结束测试
Fixture的三种调用方法
方式一:函数或类里面方法直接传fixture的函数参数名称
定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要以test开头,跟用例区分开。
fixture是有返回值的,没有返回值默认为None。
用例调用fixture的返回值,直接就是把fixture的函数名称当做变量名称。
import pytest
@pytest.fixture()
def test1():
a = "111"
return a
def test2(test1):
assert test1 == "111"
===
方式二:使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例
import pytest
@pytest.fixture()
def test1():
a = "南京"
print("fixture")
return a
def test2(test1):
assert test1 == "南京"
@pytest.fixture()
def login():
print("请先登录")
@pytest.mark.usefixtures("login","test1")
def test3():
print("用例1:调用fixture")
@pytest.mark.usefixtures("login")
@pytest.mark.usefixtures("test1")
def test4():
'''
叠加usefixtures:如果一个方法或者一个class用例想要同时调用多个fixture,
可以使用@pytest.mark.usefixture()进行叠加。
注意叠加顺序,先执行的放底层,后执行的放上层。
:return:
'''
print("用例2:叠加userfixture")
注意:usefixtures与传fixture区别
如果fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。
当fixture需要用到return出来的参数时,只能讲参数名称直接当参数传入,不需要用到return出来的参数时,两种方式都可以。
方式三:fixture自动使用autouse=True
当用例很多的时候,每次都传这个参数,会很麻烦。fixture里面有个参数autouse,默认是False没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参了,autouse设置为True,自动调用fixture功能
import pytest
@pytest.fixture(autouse=True)
def login3():
print("====auto===,自动执行该fixture")
def test5():
print("用例3:执行前自动执行fixture")