fixture跨模块共享(conftest.py)
阅读目录:
1. conftest.py 基本介绍
2. 示例
3. 指定引用全局fixture
conftest.py 基本介绍
conftest.py定义:
是一个特殊的文件,用于定义测试配置 -- 包含:fixture(测试夹具)、markers(标记)、 hooks(钩子) 以及其他配置选项
conftest.py作用:
提供了一种集中管理和重测试设置的方式,有助于提高测试代码的可读性、可维护性和效率
- 共享fixtures: 若多个模块使用的fixture相同,则可以将fixture写在conftest.py中(定义备注: fixtures是pytest中的一个核心概念,用于设置和清理测试环境)
- 组织测试配置:conftest.py文件可以用来组织和集中管理测试配置, 例如测试数据、测试环境的配置等,有助于保持测试代码的整洁和可维护性
- 定义markers: Markers 是用来标记测试用例的,可以用于分类测试,或者指定某些测试需要的满足条件, 子啊conftest.py中定义markers可以方便的在测试用例中引用
- 配置插件: 在conftest.py文件中使用 pytest_plugins 变量后, 可以导入和配置插件,使得插件的功能在测试中可用
- 定义hooks:pytest提供了多个hooks,可在测试执行的不同阶段去执行自定义代码,通过在conftest.py中自定义的hooks,可以控制测试的执行流程
- 控制测试并执行: 若使用的pytest-xdist 插件来并行执行测试, conftest.py 中的fixture 可以被用来控制并行测试的行为,例: 通过scope= 'module' 来确保每个模块的测试在单独的进程中执行
- 测试环境隔离: conftest.py 文件通常位于测试目录中,有助于隔离测试环境和生产环境,并确保测试不会影响生产代码
- 模块级别的fixture: 在conftest.py中定义的fixture默认具有模块级别的作用域,即意味着他们会为该模块中的所有测试用例执行一次,你可以通过置顶不同的scope参数来改变这个行为-- function、class、session
conftest.py特点
- 文件名称默认为conftest.py 是pytest框架中固定的名字,不能随意更改,通常在里面写用例执行前的一些初始化操作
- conftest.py文件 可以有多个(全局、局部), 搜索优先级自底而上(从和模块统计目录开始找,一直到项目根目录),遵循就近原则
- conftest.py 中的fixture 可以跨文件调用,支持函数引用、通过装饰器调用,也可以自动适配(此时autouse=True; 若就近的一个都是False,远的一个都是True,此时还是会自动适配近的,详见:文章末尾)
- conftest.py 文件作用范围是它同级的test文件,或者下面的test文件
- 不需要import conftest.py , pytest框架会自动识别该文件,放到根目录下 就可以全局目录调用
- conftesst.py 文件不能被其他文件导入
示例
conftest.py 仅做用于局部
局部 conftest.py
#! usr/bin/env python
# _*_ coding: utf-8 _*_
# @Author: zsc
# @vx: M_Haynes
import pytest
#
# @pytest.fixture()
# def fixture_login():
# print(" --------------- 进行登录")
# yield
# print(" ----------------- 进行登出")
#
# @pytest.fixture()
# def login(fixture_login):
# print(" ============ fun")
test_example7.py
#! usr/bin/env python
# _*_ coding: utf-8 _*_
# @Author: zsc
# @vx: M_Haynes
import pytest
# def test_example7(login):
# print(" ----------------------- test example7")
conftest.py 作用于全局
#! usr/bin/env python
# _*_ coding: utf-8 _*_
# @Author: zsc
# @vx: M_Haynes
"""
作用于全局 -- 即 sub_case这个文件下
"""
import pytest
# @pytest.fixture(autouse=True , scope="function")
# def setup_sub_function():
# print(" -------------- setup_sub_function : 前置 -------------")
# yield
# print(" -------------- setup_sub_function : 后置 --------------")
#
#
# @pytest.fixture(autouse=True, scope="module")
# def setup_sub_module():
# print(" -------------- setup_sub_module : 前置 ------------")
# yield
# print(" -------------- setup_sub_module teardown : 后置 --------------")
#
#
# @pytest.fixture(autouse=True, scope="class")
# def setup_sub_class():
# print("-------------- teardown_sub_class : 前置 -----------------")
# yield
# print(" -------------- teardown_sub_class : 后置 ---------------")
#
# @pytest.fixture(autouse=True, scope="package")
# def setup_sub_package():
# print(" -------------- setup_sub_package : 前置 --------------")
# yield
# print(" -------------- setup_sub_package : 后置 --------------")
#
# @pytest.fixture(autouse=True, scope="session")
# def setup_sub_session():
# print(" -------------- setup_sub_session : 前置 --------------")
# yield
# print(" -------------- setup_sub_session : 后置 ---------------")
结果:
conftest.py 局部和全局同时存在且同名的情况
全局添加:
### 全局和局部都有同名的 fixture
# @pytest.fixture(autouse=True, scope="function")
# def tongming_fixture():
# print(" -------------- tongming_fixture : 前置 同名的fixure --- 全局")
# yield
# print(" -------------- tongming_fixture : 后置 同名的fixture --- 全局")
局部添加:
# @pytest.fixture(autouse=False, scope="function")
# def tongming_fixture():
# print(" -------------- tongming_fixture : 前置 同名的fixure --- 局部")
# yield
# print(" -------------- tongming_fixture : 后置 同名的fixture --- 局部")
#
结果:
调用的fixture是局部的tongming_fixture,虽然是False,但是全局是True,所以哪怕没调用,也会执行这个局部fixture
全局添加:
@pytest.fixture(autouse=False, scope="function")
def tongming_fixture():
print(" -------------- tongming_fixture : 前置 同名的fixure --- 全局")
yield
print(" -------------- tongming_fixture : 后置 同名的fixture --- 全局")
局部添加:
@pytest.fixture(autouse=True, scope="function")
def tongming_fixture2():
print(" -------------- tongming_fixture : 前置 同名的fixure --- 局部")
yield
print(" -------------- tongming_fixture : 后置 同名的fixture --- 局部")
指定引用全局fixture
用例中可以通过@pytest.mark.usefixtures()指定引用全局autouse=False的fixture
@pytest.mark.usefixtures("tongming_fixture")
def test_example7():
print(" ----------------------- test example7")
更多交流和持续更新 请扫码 + VX
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。