1、Scope参数作用范围说明
fixture里面scope参数可以控制fixture的作用范围:
session > package >module > class > function
default:不传参数就是默认的,作用域就是所有的函数
class:作用域是每个class文件,只会运行一次
module:作用域是一个模块,在一个模块中只会运行一次
package :作用域是在一个package包中都有效 需要将fixture 放到 conftest里
session :在整个会话都有效,整个pytest 程序只运行一次 需要将fixture 放到 conftest里
例子 12-1
代码:
# -*- coding:utf-8 -*-
# Author:tang_ren_li
# 2022-1-29 22:45
import pytest
#自动调用打开 默认范围为函数级别 在自动调用的情况,无法向测试用例传参
@pytest.fixture(autouse=True)
def fixture_7():
print(" 默认范围 模块里定义 fixture7前置调用 !")
yield '默认范围模块里定义 fixture7 '
print(" 默认范围模块里定义 fixture7后置调用 !")
@pytest.fixture(autouse=True,scope='class')
def fixture_8():
print(" class范围模块里定义 fixture8前置调用 !")
yield 'class范围模块里定义 fixture8'
print("class范围模块里定义 fixture8后置调用 !")
@pytest.fixture(autouse=True,scope='module')
def fixture_9():
print(" module范围模块里定义 fixture9前置调用 !")
yield 'module范围模块里定义 fixture9 '
print("module范围模块里定义 fixture9后置调用 !")
def test_case_1():
print(" test_case 1 running !")
assert 1
class Test_A():
def test_case_A_1(self):
print(" test_case_A_1 running !")
def test_case_A_2(self):
print(" test_case_A_2 running !")
def test_case_A_3(self):
print(" test_case_A_3 running !")
运行结果:
================== test session starts =============================
collecting … collected 4 items
scope_test.py::test_case_1
module范围模块里定义 fixture9前置调用 !
class范围模块里定义 fixture8前置调用 !
默认范围 模块里定义 fixture7前置调用 !
PASSED [ 25%] test_case 1 running !
默认范围模块里定义 fixture7后置调用 !
class范围模块里定义 fixture8后置调用 !
scope_test.py::Test_A::test_case_A_1
class范围模块里定义 fixture8前置调用 !
默认范围 模块里定义 fixture7前置调用 !
PASSED [ 50%] test_case_A_1 running !
默认范围模块里定义 fixture7后置调用 !
scope_test.py::Test_A::test_case_A_2
默认范围 模块里定义 fixture7前置调用 !
PASSED [ 75%] test_case_A_2 running !
默认范围模块里定义 fixture7后置调用 !
scope_test.py::Test_A::test_case_A_3
默认范围 模块里定义 fixture7前置调用 !
PASSED [100%] test_case_A_3 running !
默认范围模块里定义 fixture7后置调用 !
class范围模块里定义 fixture8后置调用 !
module范围模块里定义 fixture9后置调用 !
===================== 4 passed in 0.03s ====================
说明:
fixture 可以在模块文件中直接定义,可以使用函数级别, 类级别,模块级别三种范围
fixture
所有不在类里的函数当做一个类来看待,调用一次类范围的fixture
自动调用打开 默认范围为函数级别在自动调用的情况,无法向测试用例传参
2、Conftest.py 文件的讲解
什么是conftest.py
可以理解成一个专门存放fixture的配置文件
实际开发场景
多个测试用例文件(test_.py)的所有用例都需要*用登录功能来作为前置操作,那就不能把登录功能写到某个用例文件中去了
如何解决上述场景问题?
conftest.py的出现,就是为了解决上述问题,单独管理一些全局的fixture
conftest.py配置fixture注意事项
- pytest会默认读取conftest.py里面的所有fixture
- conftest.py 文件名称是固定的,不能改动
- conftest.py只对同一个package下的所有测试用例生效
- 不同目录可以有自己的conftest.py,一个项目中可以有多个conftest.py
- 测试用例文件中不需要手动import conftest.py,pytest会自动查找
例子 12-2
目录:
构建2个测试用例包,每个包配置有2个单独的conftest文件 <br /> 在根目录配置一个单独的conftest文件
代码:
test_case_1 包 :
scope_test.py , 就是例子12-1 所示代码
Test_Demo1.py :
# -*- coding:utf-8 -*-
# Author:tang_ren_li
# 2022-1-29 22:45
import pytest
class Test_Demo1():
def test_demo_case_1(self):
print(" test_demo_case_1 running !")
def test_demo_case_2(self):
print(" test_demo_case_2 running !")
conftest.py
# -*- coding:utf-8 -*-
# Author:tang_ren_li
# 2022-2-1 22:45
import pytest
#自动调用打开 默认范围为函数级别 在自动调用的情况,无法向测试用例传参
@pytest.fixture(autouse=True)
def fixture_1():
print(" 默认范围fixture1前置调用 !")
yield '默认范围fixture1 '
print(" 默认范围fixture1后置调用 !")
@pytest.fixture(autouse=True,scope='class')
def fixture_2():
print(" class范围fixture2前置调用 !")
yield 'class范围fixture2 '
print("class范围fixture2后置调用 !")
@pytest.fixture(autouse=True,scope='module')
def fixture_3():
print(" module范围fixture3前置调用 !")
yield 'module范围fixture3 '
print("module范围fixture3后置调用 !")
@pytest.fixture(autouse=True,scope='package')
def fixture_4():
print(" test_case_1 package范围fixture4前置调用 !")
yield 'test_case_1 package范围fixture4 '
print("test_case_1 package范围fixture4后置调用 !")
test_case_2 包 :
Test_Demo2.py
class Test_Demo2():
def test_demo2_case1(self):
print("test_demo2_case1 run !")
def test_demo2_case2(self):
print("test_demo2_case2 run !")
conftest.py
import pytest
@pytest.fixture(autouse=True,scope='package')
def fixture_4():
print(" test_case_2 package范围fixture4前置调用 !")
yield 'test_case_2 package范围fixture4 '
print("test_case_2 package范围fixture4后置调用 !")
根目录:
conftest.py
import pytest
@pytest.fixture(autouse=True,scope='session')
def fixture_6():
print("session范围fixture6前置调用 !")
yield 'session范围fixture6'
print("session范围fixture6后置调用 !")
run.py
import pytest
if __name__ == '__main__':
pytest.main(["-s"])
运行结果:
===================== test session starts=============================
collected 8 items
test_case_1\Test_Demo1.py
session范围fixture6前置调用 !
test_case_1 package范围fixture4前置调用 !
module范围fixture3前置调用 !
class范围fixture2前置调用 !
默认范围fixture1前置调用 !
test_demo_case_1 running !
. 默认范围fixture1后置调用 !
默认范围fixture1前置调用 !
test_demo_case_2 running !
. 默认范围fixture1后置调用 !
class范围fixture2后置调用 !
module范围fixture3后置调用 !
test_case_1\scope_test.py
module范围fixture3前置调用 !
module范围模块里定义 fixture9前置调用 !
class范围fixture2前置调用 !
class范围模块里定义 fixture8前置调用 !
默认范围fixture1前置调用 !
默认范围 模块里定义 fixture7前置调用 !
test_case running !
. 默认范围模块里定义 fixture7后置调用 !
默认范围fixture1后置调用 !
class范围模块里定义 fixture8后置调用 !
class范围fixture2后置调用 !
class范围fixture2前置调用 !
class范围模块里定义 fixture8前置调用 !
默认范围fixture1前置调用 !
默认范围 模块里定义 fixture7前置调用 !
test_case_A_1 running !
. 默认范围模块里定义 fixture7后置调用 !
默认范围fixture1后置调用 !
默认范围fixture1前置调用 !
默认范围 模块里定义 fixture7前置调用 !
test_case_A_2 running !
. 默认范围模块里定义 fixture7后置调用 !
默认范围fixture1后置调用 !
默认范围fixture1前置调用 !
默认范围 模块里定义 fixture7前置调用 !
test_case_A_3 running !
. 默认范围模块里定义 fixture7后置调用 !
默认范围fixture1后置调用 !
class范围模块里定义 fixture8后置调用 !
class范围fixture2后置调用 !
module范围模块里定义 fixture9后置调用 !
module范围fixture3后置调用 !
test_case_1 package范围fixture4后置调用 !
test_case_2\Test_Demo2.py test_case_2
package范围fixture4前置调用 !
test_demo2_case1 run !
.test_demo2_case2 run !
.test_case_2 package范围fixture4后置调用 !
session范围fixture6后置调用 !
==================== 8 passed in 0.06s ===========================
说明:
1. 较高 scope 范围的fixture(session)在较低 scope 范围的fixture( function 、 class )之前实例化【session > package > module > class > function】
2 . 具有相同作用域的fixture遵循测试函数中声明的顺序,并遵循fixture之间的依赖关系【在fixture_A里面依赖的fixture_B优先实例化,然后到fixture_A实例化】
3. 当模块里面的fixture 和 conftest里面的 fixture 都存在通类fixture时
4. 前置先运行conftest文件里的同级别fixture ,后置后运行conftest文件里的同级别fixture 3. session 始终跟随pytest 程序只运行一次,