pytest_框架(7) -- fixture跨模块共享(conftest.py)

fixture跨模块共享(conftest.py)

阅读目录:
  1. conftest.py 基本介绍
  2. 示例
  3. 指定引用全局fixture

conftest.py 基本介绍

conftest.py定义:
是一个特殊的文件,用于定义测试配置 – 包含:fixture(测试夹具)、markers(标记)、 hooks(钩子) 以及其他配置选项

conftest.py作用:
提供了一种集中管理和重测试设置的方式,有助于提高测试代码的可读性、可维护性和效率

  1. 共享fixtures: 若多个模块使用的fixture相同,则可以将fixture写在conftest.py中(定义备注: fixtures是pytest中的一个核心概念,用于设置和清理测试环境)
  2. 组织测试配置:conftest.py文件可以用来组织和集中管理测试配置, 例如测试数据、测试环境的配置等,有助于保持测试代码的整洁和可维护性
  3. 定义markers: Markers 是用来标记测试用例的,可以用于分类测试,或者指定某些测试需要的满足条件, 子啊conftest.py中定义markers可以方便的在测试用例中引用
  4. 配置插件: 在conftest.py文件中使用 pytest_plugins 变量后, 可以导入和配置插件,使得插件的功能在测试中可用
  5. 定义hooks:pytest提供了多个hooks,可在测试执行的不同阶段去执行自定义代码,通过在conftest.py中自定义的hooks,可以控制测试的执行流程
  6. 控制测试并执行: 若使用的pytest-xdist 插件来并行执行测试, conftest.py 中的fixture 可以被用来控制并行测试的行为,例: 通过scope= ‘module’ 来确保每个模块的测试在单独的进程中执行
  7. 测试环境隔离: conftest.py 文件通常位于测试目录中,有助于隔离测试环境和生产环境,并确保测试不会影响生产代码
  8. 模块级别的fixture: 在conftest.py中定义的fixture默认具有模块级别的作用域,即意味着他们会为该模块中的所有测试用例执行一次,你可以通过置顶不同的scope参数来改变这个行为-- function、class、session

conftest.py特点

  1. 文件名称默认为conftest.py 是pytest框架中固定的名字,不能随意更改,通常在里面写用例执行前的一些初始化操作
  2. conftest.py文件 可以有多个(全局、局部), 搜索优先级自底而上(从和模块统计目录开始找,一直到项目根目录),遵循就近原则
  3. conftest.py 中的fixture 可以跨文件调用,支持函数引用、通过装饰器调用,也可以自动适配(此时autouse=True; 若就近的一个都是False,远的一个都是True,此时还是会自动适配近的,详见:文章末尾)
  4. conftest.py 文件作用范围是它同级的test文件,或者下面的test文件
  5. 不需要import conftest.py , pytest框架会自动识别该文件,放到根目录下 就可以全局目录调用
  6. conftesst.py 文件不能被其他文件导入

示例

conftest.py 仅做用于局部

image
局部 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")

image

image

conftest.py 作用于全局

image

#! 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 : 后置 ---------------")

结果:
image

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 --- 局部")
#

image
结果:
调用的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 --- 局部")

image

指定引用全局fixture

用例中可以通过@pytest.mark.usefixtures()指定引用全局autouse=False的fixture

@pytest.mark.usefixtures("tongming_fixture")
def test_example7():
    print(" ----------------------- test example7")

image

更多交流和持续更新 请扫码 + VX

image

本文由mdnice多平台发布

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周承森

敲键盘不易~ 给点鼓励~ 感恩

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值