pytest 生成器、装饰器、迭代器介绍及应用

Pytest常用装饰器使用 pytest装饰器使用 阅读详情

pytest简单介绍

pytest 是一个功能强大且易于使用的 Python 测试框架。它提供了丰富的功能和灵活的扩展机制,使得编写和运行测试变得简单和高效。

装饰器的介绍

在pytest测试框架中,装饰器是一种用于修改、扩展或定制测试函数行为的机制。本质上是一个函数。pytest提供了多个内置的装饰器,用于标记测试函数、控制测试执行、参数化测试等。
它可以在不改变函数调用方式的前提下,通过在被装饰函数的定义之前使用@符号来应用装饰器。

pytest 中常用的装饰器

@pytest.fixture

在pytest测试框架中,夹具(fixture)是一种用于为测试用例提供预置环境或共享资源的机制。夹具可以用于初始化测试数据、创建对象、连接数据库、模拟网络请求等操作。

夹具在测试用例的执行过程中起到了关键的作用,它们可以在测试用例执行之前或之后执行特定的操作,以确保测试环境的正确设置和清理。夹具的使用可以帮助我们更方便地组织和管理测试代码,提高代码的可重用性和可维护性。

在pytest中,夹具可以通过使用@pytest.fixture装饰器来定义。夹具函数可以具有不同的作用域,包括函数级别、模块级别、类级别和会话级别,根据需要选择适当的作用域。

import pytest

@pytest.fixture
def setup_database():
    # 设置数据库连接
    db = connect_to_database()
    # 返回数据库连接对象
    yield db
    # 在测试后关闭数据库连接
    db.close()

def test_database_operations(setup_database):
    # 使用夹具提供的数据库连接对象进行数据库操作
fixture 常用参数
scope

指定 fixture 的作用域,控制其生命周期和适用范围。可选值包括 “function”(函数级别,默认)、“class”(类级别)、“module”(模块级别)、 “session”(会话级别)。

function: 函数级,每个测试函数都会执行一次固件;
class: 类级别,每个测试类执行一次,所有方法都可以使用;
module: 模块级,每个模块()执行一次,模块内函数和方法都可使用
session: 会话级,一次测试只执行一次,所有被找到的函数和方法都可用。
备注:模块是一个包含函数、变量和类等定义的文件。模块可以是一个独立的 .py 文件,也可以是包中的一个 .py 文件。

import pytest

@pytest.fixture(scope="module")
def setup_module():
    # ...

@pytest.fixture(scope="class")
def setup_class():
    # ...

@pytest.fixture(scope="function")
def setup_function():
    # ...

@pytest.fixture(scope="session")
def setup_session():
    # ...
autouse

指定是否自动应用 fixture,默认值为 False,需要在测试函数中显式使用 fixture。设置为 True 后,fixture 将自动应用于所有测试函数。

import pytest

@pytest.fixture(autouse=True)
def setup():
    # 自动应用 fixture
    # ...
params

允许为 fixture 提供不同的参数化值,从而生成多个实例。可以是单个值、列表、元组或参数化装饰器生成的值。

import pytest

@pytest.fixture(params=[1, 2, 3])
def setup(request):
    value = request.param
    # 使用 value 进行设置操作
    # ...
name

指定 fixture 的名称。默认情况下,fixture 的名称是函数名。

import pytest

@pytest.fixture(name="custom_fixture_name")
def setup_function():
    # ...
params 和 ids

在参数化 fixture 时,params 参数用于指定参数值,ids 参数用于指定参数值的标识符,以便在测试报告中更好地显示。

import pytest

@pytest.fixture(params=[("apple", 3), ("banana", 5)], ids=["fruit1", "fruit2"])
def setup(request):
    fruit, quantity = request.param
    yield fruit, quantity

def test_fruit_count(setup):
    fruit, quantity = setup
    assert quantity > 0
    print(f"There are {quantity} {fruit}(s).")

在上面的示例中,我们定义了一个 setup 的 fixture,使用 params 参数为其提供了两组参数值:(“apple”, 3) 和 (“banana”, 5)。同时,我们使用 ids 参数为每组参数值指定了相应的标识符:“fruit1” 和 “fruit2”。

在测试函数 test_fruit_count 中,我们使用 setup 作为参数并解包得到 fruit 和 quantity。然后我们进行断言,确保 quantity 大于 0,并输出对应的水果数量。

当我们运行这个测试时,它会生成两个测试实例,分别对应于每组参数值。在测试报告中,这些参数化的测试实例将以指定的标识符进行标识,让我们更清晰地了解每次测试的上下文和参数值:

test_example.py::test_fruit_count[fruit1] PASSED
test_example.py::test_fruit_count[fruit2] PASSED
@pytest.mark.parametrize

@pytest.mark.parametrize 装饰器用于参数化测试函数,允许为测试函数提供多组输入参数。这样可以重复运行测试,并自动展开所有组合的参数。

可以传递不同的参数类型,以下为常见的参数类型

单个参数值:

@pytest.mark.parametrize("name", ["Alice", "Bob", "Charlie"])
def test_greet(name):
    print(f"Hello, {name}!")

上述示例中,name 参数会依次取值为 “Alice”、“Bob” 和 “Charlie”,每个值都会作为参数传递给 test_greet 测试函数。

多个参数值:
@pytest.mark.parametrize("x, y, expected", [
    (1, 2, 3),
    (10, 20, 30),
    (-5, 5, 0),
])
def test_addition(x, y, expected):
    assert add(x, y) == expected

在上述示例中,x、y 和 expected 分别表示两个输入参数和预期输出。通过列表中的元组,你可以定义多个测试情况,每个测试情况都会传递相应的参数给 test_addition 测试函数。

参数组合:
@pytest.mark.parametrize("x", [1, 2])
@pytest.mark.parametrize("y", [10, 20])
def test_multiply(x, y):
     print(x,y)

在上述示例中,x 和 y 的参数值会进行组合,生成四个测试情况:(1, 10)、(1, 20)、(2, 10) 和 (2, 20)。每个组合都会作为参数传递给 test_multiply 测试函数。

参数化元组或字典:
tuple_1 = [("Alice", 25), ("Bob", 30)]
key_1 = [{"Alice": 25, "Bob": 30}]
@pytest.mark.parametrize("person", tuple_1)
def test_age(person):
    name, age = person # 将元组的值,赋值给name,age变量
    print(f"name:{name},age:{age}")
# 打印结果
# test_convert.py::test_age[person0] PASSED   [ 50%]name:Alice,age:25
# test_convert.py::test_age[person1] PASSED   [100%]name:Bob,age:30

在上述示例中,person 参数被定义为一个元组列表,每个元组包含姓名和年龄。test_age 测试函数将分别解包元组中的值,并进行打印。

@pytest.mark.skip

只有在满足某些条件时测试才能通过,否则pytest应该跳过运行测试

  • 无条件跳过模块中的所有测试:
    pytestmark = pytest.mark.skip(reason=“all tests still WIP”)

  • 根据某些条件跳过模块中的所有测试:
    pytestmark = pytest.mark.skipif(sys.platform == “win32”, reason=“tests for linux only”)

  • 如果缺少某些导入,则跳过模块中的所有测试:
    pexpect = pytest.importorskip(“pexpect”) 此为函数应用

@pytest.mark.xfail

将功能标记为预期失败

reason参数:用于说明预期失败的原因。
strict:用于指定是否严格检查预期失败
run:用于指定在哪些条件下运行测试。

"always":无论测试结果如何,始终运行测试(默认值)。
"passed":只有当测试通过时才运行测试。
"failed":只有当测试失败时才运行测试。(如果测试成功,那就会跳过此用例)
"skipped":只有当测试被跳过时才运行测试。

raises:用于指定预期的异常类型。(如果返回的错误非预期异常,用例结果为failed)

strict举例
# strict=False, 如果测试预期失败,实际测试通过,结果依旧为XPASS
# strict=True, 如果测试预期失败,实际测试通过,结果依旧为FAILD
# strict=True或False, 如果测试预期失败,实际测试也失败,结果为 XFAIL
# 如不给strict参数,strict=False(默认值)
import pytest
@pytest.mark.xfail(strict=True, reason="Bug #12345")
def test_example():
    assert 1 + 1 == 3

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自定义装饰器

在 Pytest 中,除了使用内置的装饰器,也可以使用自定义装饰器来扩展测试框架的功能。

import pytest

def my_custom_decorator(func):
    def wrapper(*args, **kwargs):
        # 在测试函数之前执行的代码
        print("Before test")

        # 调用原始的测试函数
        result = func(*args, **kwargs)

        # 在测试函数之后执行的代码
        print("After test")

        return result

    return wrapper

# 使用自定义装饰器标记测试函数
@my_custom_decorator
def test_example():
    assert 1 + 1 == 2

# 运行测试
pytest.main()

在上面的示例中,my_custom_decorator 是一个自定义装饰器函数。它接受一个函数作为参数,并返回一个内部函数 wrapper。在 wrapper 函数中,你可以执行在测试函数前后需要进行的操作,然后调用原始的测试函数。

将自定义装饰器应用于测试函数时,使用 @ 符号将装饰器应用于目标函数上方。在示例中,@my_custom_decorator 标记了 test_example 函数,使其在运行时被自定义装饰器包装执行。

如何判断一个函数是不是装饰器
  • 函数接受一个函数作为参数:装饰器是一个函数,通常会接受另一个函数作为参数。这个参数表示需要被装饰的目标函数。

  • 函数内部定义了一个包装函数或返回函数:装饰器通常会在内部定义一个包装函数,用于包裹原始函数,并在包装函数内部执行一些额外的操作。或者,装饰器可以返回一个新的函数,该函数用于替代原始函数。

  • 装饰器返回的函数能够被调用:装饰器返回的函数应该可以像原始函数一样被调用,即具有相同的调用方式和参数。

备注:仅仅满足上述特征并不意味着一个函数一定是装饰器。在 Python 中,函数具有很大的灵活性,可以以各种方式组织和使用。因此,对于一个函数是否是装饰器,最终的判断还需要考虑上下文和函数的实际用途。

生成器的介绍

生成器(Generator)是一种特殊类型的函数,它可以通过使用 yield 语句来生成一系列的值,而不是一次性返回所有的值。生成器在每次迭代时生成一个值,并在生成值后暂停执行,保存其内部状态,以便下次迭代时从暂停的地方继续执行。
生成器是一种特定的迭代器。

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# 使用生成器生成斐波那契数列的前 10 个数
fib_gen = fibonacci()
for _ in range(10):
    print(next(fib_gen))

以上示例中的 fibonacci 函数是一个生成器函数,通过 yield 语句逐个生成斐波那契数列的值。在使用生成器时,通过调用 next() 函数来获取下一个生成的值。

生成器在 Python 中是非常强大和灵活的工具,可以帮助处理各种数据处理和计算任务。它们提供了一种高效、简洁和可扩展的编程模式。

生成器的特点和优势

  • 懒加载(Lazy Evaluation):生成器逐个生成值,只在需要时才计算和返回,从而节省内存和计算资源。这对于处理大型数据集或无限序列非常有用。

  • 延迟计算(Deferred Computation):生成器可以根据需要延迟计算值,而不是一次性计算所有值。这样可以提高程序的性能和效率。

  • 状态保存:生成器在每次生成值后,可以保存其内部状态,包括变量的值和执行位置。这使得生成器能够从上次暂停的地方继续执行,而不需要重新计算或重复操作。

  • 简洁性:使用生成器可以以更简洁的方式编写代码,避免显式创建和管理临时列表或迭代器。

迭代器的介绍

迭代器(Iterator)是一种用于遍历集合或序列的对象,它提供了一种逐个访问元素的方式。迭代器实现了迭代协议(Iterator Protocol),即具有 iter() 和 next() 方法。

迭代器的内部都有一个__next__() 方法,来返回下一个元素,当我们调用内置函数next(迭代器)时,本质就是迭代器.next()

备注:迭代器一定是一个可迭代对象,但可迭代对象不一定是一个迭代器

示例

enumerate()

Python 内置函数 enumerate() 返回的是一个迭代器对象,它具有迭代器的方法和行为,包括 iter() 和 next() 方法。

__iter__() 方法:返回迭代器对象自身。在使用 iter(enumerate(iterable)) 创建迭代器时,该方法被隐式调用。
__next__() 方法:返回迭代器的下一个元素。在使用 next(enumerator) 获取迭代器的下一个值时,该方法被调用。
fruits = ['apple', 'banana', 'orange']
enumerator = enumerate(fruits)

# 使用 iter() 方法创建迭代器
iterator = iter(enumerator)

# 使用 next() 方法获取迭代器的下一个元素
print(next(iterator))  # 输出: (0, 'apple')
print(next(iterator))  # 输出: (1, 'banana')
print(next(iterator))  # 输出: (2, 'orange')

在这个示例中,我们首先使用 enumerate(fruits) 创建一个迭代器 enumerator。然后我们使用 iter() 方法将其转换为迭代器对象 iterator。接下来,我们使用 next() 方法连续调用迭代器的 next() 方法来获取迭代器的下一个元素。

自定义迭代器类

class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0
# 迭代器必须实现__iter__() 方法,返回一个迭代器对象(其自身即可)
    def __iter__(self):
        return self
# 迭代器必须实现__next__() 方法,每调用一次就返回下一个元素
    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        value = self.data[self.index]
        self.index += 1
        return value

# 创建一个自定义序列
my_sequence = [1, 2, 3, 4, 5]

# 创建迭代器对象
my_iterator = MyIterator(my_sequence)

# 使用迭代器遍历序列
for item in my_iterator:
    print(item)

在上述示例中,MyIterator 类实现了迭代器协议,具有 iter() 和 next() 方法。iter() 方法返回迭代器对象本身,而 next() 方法根据当前位置返回下一个元素,并更新迭代器的状态。

通过使用自定义的迭代器对象 my_iterator,可以通过简单的 for 循环遍历自定义序列 my_sequence 中的元素。

需要注意的是,当迭代器达到序列的末尾时,它会引发 StopIteration 异常,以通知循环停止迭代。

迭代器在 Python 中广泛应用于各种场景,包括遍历列表、文件读取、数据库查询等。它们提供了一种高效、可定制和统一的方式来处理和访问数据集合。

pytest02 装饰器 可以在 测试模块 中的全局级别声明,以将一个或多个 标记 应用于所有测试函数和方法。可以是单个标记或标记列表(按从左到右的顺序应用)。pytest.ini 配置文件中注册当传递 --strict-markers 命令行标志时,使用 @pytest.mark.name_of_the_mark 装饰器应用的任何未知标记都将触发错误.[pytest]markers =slow: 标记为耗时较长的测试ui: 用户界面相关测试smoke: 冒烟测试custom_marker: 其他自定义标记。 阅读详情

相关推荐

【Pytest自动化测试详解】

1、简单灵活,非常方便的组织自动化测试用例;2、支持参数化,可以细粒度地控制要测试的测试用例;3、能够支持简单的单元测试和复杂的功能测试,比如web端selenium/移动端appnium等自动化测试、request接口自动化测试4、pytest具有很多第三方插件,并且可以自定义扩展,比如测试报告生成,失败重运行机制5、测试用例的skip和fail处理;6、结合业界最美的测试报告allure+Jenkins,持续集成。

m0_72532779的博客 2789

Pytest测试框架(四)---装饰器的使用

pytest测试框架 装饰器的使用

weixin_44701654的博客 2964

Python核心机制深度解析:可变对象、装饰器、生成器与GIL

在Python编程中,理解对象的内存管理机制是构建高效、可靠应用的基础。可变对象与不可变对象在内存中的行为差异,直接影响着变量赋值、参数传递和对象复制的逻辑。深入其原理,有助于避免因共享状态引发的意外错误。从技术价值看,掌握这些底层机制能显著提升代码性能和可维护性。例如,装饰器作为高阶函数的语法糖,其本质是对函数执行流程的封装与扩展,广泛应用于日志记录、性能监控和权限校验等场景。生成器则通过惰性求值原理,在处理大规模数据流时能有效节省内存,是构建高效迭代器的核心工具。在并发编程领域,全局解释器锁(GIL)是

weixin_34163553的博客 489

Pytest学习教程_装饰器(二)

pytest装饰器是在使用 pytest 测试框架时用于扩展测试功能的特殊注解或修饰符。使用装饰器可以为测试函数提供额外的功能或行为。

檬柠wan 2589

Python高级特性实战:生成器、装饰器与并发编程核心技术解析

生成器作为Python内存优化的关键技术,通过yield关键字实现惰性计算,在处理大数据流时能显著降低内存占用。其原理是基于迭代器协议,在需要时按需生成数据而非一次性加载全部内容。这种技术价值在于解决IO密集型任务的内存瓶颈问题,广泛应用于文件处理、数据流分析和网络请求等场景。装饰器则通过高阶函数实现代码复用,结合元编程能力为函数添加额外功能,在Web开发、API设计和性能监控中发挥重要作用。理解这些Python高级特性有助于开发者编写更高效、可维护的企业级应用,自然过渡到本文对Python核心进阶技术的深

weixin_30820077的博客 444

IEC104协议下的文件传输与软件升级的技术细节与操作流程

本文深入探讨IEC104协议下的文件传输过程和软件升级机制,揭示其背后的技术细节和操作流程。

2401_86189088的博客 2519

python 之 迭代器、生成器、装饰器

生成器是创建迭代器的一种更简单、更优雅的方式。不需要去写一个完整的类并实现__iter__()和__next__()方法。只需要写一个普通的函数,但是使用 yield关键字而不是return来返回值。

weixin_44929150的博客 1401

基于SpringBoot+Vue的公司考勤管理系统

为什么选择我博主是CSDN毕设辅导博客第一人兼开派祖师爷、博主本身从事开发软件开发、有丰富的编程能力和水平。专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流和合作。

m0_71849512的博客 1153

小彩蛋:推导式、生成器&迭代器、装饰器&fixture

小彩蛋:推导式、生成器&迭代器、装饰器&fixture

solicitous的专栏 952

Python逻辑回归——以车险定价为例(附代码)

保费定价也成为费率厘定,是保险公司运营的环节之一。其过程是根据保单(被保险人)的损失经验和其他相关信息建立模型,并且对未来的保险成本(赔款、代理人佣金、一般管理费用、理赔费用以及支持该业务所需的资本金成本)进行预测的过程。保险公司实际使用的费率还会受到市场供求关系和公司自身发展战略的影响。汽车保险也称机动车辆保险,失意机动车辆本身及其第三者责任等为保险标的的一种运输工具险,在非寿险井算领域中占有重要地位。

m0_62929945的博客 1979

XR Interaction Toolkit实战:为HTC Vive Cosmos打造抓取、投掷与UI交互(Unity 2023教程)

本文详细介绍了如何使用Unity 2023和XR Interaction Toolkit为HTC Vive Cosmos开发抓取、投掷与UI交互系统。通过实战案例'VR投掷训练室',从基础配置到高级功能实现,涵盖物理抓取、精准投掷机制和VR UI交互设计,帮助开发者提升VR交互开发技能。

weixin_30562507的博客 247

python知识点

迭代器是一个可以遍历的对象,包含了一组元素,实现了__iter__()和__next__()方法。当执行next()操作时,返回其中一个元素。当所有元素都被返回后,再执行next()报异常—StopIteration生成器是使用了yield关键字的函数,这个函数也可以称作是一个迭代器。生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和__next__方法),不需要再手动实现这两个方法。inner引用outer作用域的变量(即x。

杂物堆 535

DCDC--控制方式(Control Mode)

DCDC反馈控制方式

网始如芯个人博客 1万+

Python 极客指南(二)

我们在本节继续我们的旅程,通过学习 Python 语言的先进概念。这包括为你复习一些概念,并介绍高级主题,如迭代器、生成器、错误和异常处理。这将帮助你进入 Python 编程的下一个层次。除了编写 Python 程序外,我们还探讨如何使用 unittest 和 pytest 等测试框架编写和自动化单元测试和集成测试。在本节的最后部分,我们讨论了一些用于数据转换和构建 Python 装饰器的先进函数概念,以及如何使用包括 pandas DataFrames 在内的数据结构进行数据分析应用。本节包含以下章节:第

龙哥盟 758

SKILL实现电路virtuoso原理图schematic中引脚pin的net自动打上pin label

SKILL实现电路virtuoso原理图schematic中引脚pin的net自动打上pin label

qq_41510657的博客 2601

基于大模型的肾结石诊疗全流程风险预测与方案制定研究报告

目录一、引言1.1 研究背景与意义1.2 国内外研究现状1.3 研究目标与内容二、大模型技术原理与应用概述2.1 大模型的基本原理2.2 大模型在医疗领域的应用进展2.3 适用于肾结石预测的大模型选择与依据三、术前风险预测与准备3.1 患者身体状况评估3.2 结石情况分析3.3 术前准备方案制定四、术中风险预测与应对4.1 出血风险预测与处理4.2 脏器损伤风险预测与预防4.3 实时监测与决策支持五、术后恢复预测与护理5.1 恢复时间预测5.2 护理要点与措施5.3 并发症预防与处理六、并发症风险预测与管理

LCG元的博客 1146

python+appium(4)

conftest进阶使用和yield关键字解析

qq_36562656的博客 566

VMware16虚拟机:下载和安装教程

VMware16 虚拟机 下载和安装教程

MQ0522的博客 20万+

2023面试自动化测试面试题【含答案】,建议收藏

他的原理是:当我们使用 with 去通过 open 打开文件的时候,它会触发文件对象的上下文管理器,然后当 with 当中的代码运行结束后,会自动去调用上下文管理器的退出方法;第一个原则是,公共方法表示页面提供的一个服务,比如我们可以把 登录封装成一个 logo 的方法,把搜索方法封装成一个设施方法,把注册操作封装成一个 register 的方法;小整数池这个设计的初衷是为了优化程序的运行效率,需要相同的整数的时候,直接从这个整数池里面拿出来就可以用,可以避免频繁去创建和销毁这个对象,提升效率、节约内存;

m0_60054525的博客 1689

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python中的闭包和装饰器,生成器,迭代器详解

迭代器是访问集合元素的一种方式.迭代器是一个可以记住遍历位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退可以被 next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

一名IT小白 2251

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python高级用法总结--(列表推导式,迭代器,生成器,装饰器)

列表推导式(list comprehensions) 场景1:将一个三维列表中所有一维数据为a的元素合并,组成新的二维列表。 最简单的方法:新建列表,遍历原三维列表,判断一维数组是否为a,若为a,则将该元素append至新列表中。 缺点:代码太繁琐,对于Python而言,执行速度会变慢很多。 针对场景1,我们首先应该想到列表解析式来处理: lista = [item for...

ank11891的博客 467

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

python迭代器两个基本方法可供参考_python迭代器、生成器与装饰器

可迭代对象与迭代器可迭代对象可以直接作用于for循环的对象统称为可迭代对象,代码中可以通过isinstance()判断一个对象是否是Iterable对象Example:>>> from collections import Iterable>>> isinstance([],Iterable)True>>> isinstance({}, Ite...

weixin_42358261的博客 134

整理python接口自动化相关——9、回顾下之前的关键字

回顾python接口自动化相关,顺便求捞

solicitous的专栏 2738

python开发面试刷题指南

python多线程与多进程及其区别

哈哈儿 博客 454

Python函数进阶:从作用域、闭包到装饰器与生成器的实战解析

在Python编程中,函数是组织代码和实现逻辑复用的核心单元。理解函数的作用域规则是避免变量冲突和编写可预测代码的基础,它遵循LEGB查找顺序,涉及局部、闭包、全局和内置作用域。闭包作为嵌套函数的高级特性,允许内部函数‘记住’并访问其外部函数的变量,是实现有状态函数和函数工厂的关键技术,在装饰器等高级模式中广泛应用。装饰器基于闭包原理,能够在不修改原函数代码的前提下,为其动态添加日志、计时、缓存等功能,极大地提升了代码的模块化和可维护性。这些进阶特性在Web开发、数据分析和自动化脚本等实际工程场景中,对于构

weixin_30628077的博客 446

pytest之fixture函数的应用

目录一、fixture简介二、fixture功能三、fixture优势四、fixture参数列表五、fixture使用六、fixture简单应用 一、fixture简介   固件(fixture)是一些函数,pytest会在执行测试函数之前(或之后)加载运行他们。我们可以利用固件在程序运行前做初始化,运行后做清场,其中最常见的可能就是数据库的初始连接和最后关闭。pytest使用pytest.fixture()定义固件。 二、fixture功能 fixture是pytest特有的功能,它用pytest.fi

adorable_的博客 709
上一篇: Python作用域解释以及举例说明
下一篇: vSphere(vcenter)上如何克隆虚拟机
cs_mengxi
博客等级 码龄6年 2358粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值