pytest2--固件fixture

本文详细介绍了在Python测试框架pytest中,如何使用固件函数来管理测试执行前后的工作,包括fixture的定义与使用方法,以及不同作用域下的固件行为。还讨论了conftest.py文件的使用,以实现模块间的资源共享。

一.使用场景。

        当多个测试函数需要在测试执行开始前做一些准备工作或者执行结束后做一些收尾工作,并且许多测试函数需要执行这些重复工作时。我们可以定义“固件”函数来解决这个问题。

二.fixture的定义和使用方式

1.先定义固件

        定义固件就是定义函数,要为fixture函数用装饰器@pytest.fixture定义

2.再使用固件

        方式1:在要使用“固件”的测试函数的形参位置上,传入固件函数的函数名做形参,例1

        方式2:在要使用“固件”的测试函数上,使用@pytest.mark.usefixtures装饰器来声明这个测试函数。例2

        方式3:定义固件函数时,为“固件”声明要自动被使用。“autouse”赋值为True。那么所有的用例都会自动使用固件.例3

方式一举例

方式2举例:

方式3举例:

        

 3.如何使用“固件”函数的返回数据

写法如下图。

两个作用:1是在执行test1之前执行固件函数。2是固件函数的函数名就是固件函数的返回值。

本例中connect_device就是固件函数connect_device的返回值。见下图

4.如何执行收尾工作:yield关键字。上面的办法都是为了做准备工作,下面是yield做收尾工作。许多“测试函数”执行后要共同,统一的执行代码(往往是为了释放资源),就可以写在“固件函数”yield关键字后面。

运行机制过程:

1可以在“固件”函数的主体代码中,使用yield关键字将return代替
2那么固件函数执行时,遇到yield关键字时,会将yield关键字后面的数据返回给“测试函数”
3并封住固件函数的现场,将所有函数的状态数据存储到内存中,等待“测试函数”执行完成
4当测试函数执行完成后,再将yield关键字下一行代码继续执行完成固件函数的所有内容

简单讲就是,固件函数先运行,yield给返回值同时固件函数暂停运行,等待被测函数运行结束后,固件函数继续运行以执行收尾工作释放资源。

注意:无论测试函数是否报错,都会执行yield后面的语句以释放资源

5.conftest.py文件。

承上启下:上面解释了固件的好处。但是有新的问题,如果每个模块都要使用相同的固件,岂不是要在每个模块都写一次?很麻烦。这时可以使用conftest.py文件。把所有的公用的固件函数放到conftest.py文件中,所有后代目录模块都可以共享固件函数

规则如下:

1.这个文件文件名必须为conftest.py

2.这个文件无需也不应该被其他测试模块导入,会自动被pytest框架发现。当别的测试模块请求一个固件是,pytest会自动找到conftest文件中来。

3.范围:conftest.py文件所定义的包及其后代包中,都可以使用conftest.py中的固件函数

例子如下:

        图二未定义固件,直接请求的图一conftest.py中的固件函数成功。

6.固件的作用域--scope skoʊp

1)function(函数)--函数范围的作用域(默认作用域

        如果将一个固件声明成function范围的作用域

        那么使用使用这个固件的每个测试函数或方法在执行时,都要使用一次固件

2)class(类)--类范围的作用域

        如果将一个固件声明成class范围的作用域

        那么一个类中所有使用了这个固件的测试方法,仅会整体使用一次固件

                ==》一个类中所有的测试方法,总会有第一个测试方法被发现,仅在第一个测试方法执行前,先执行测试固件一次

                ==》如果固件函数中有yield,那么也仅会在这个类的测试方法都执行完成后,最后执行yield语句后剩余的语句

3)module(模块)--模块范围的作用域

        如果将一个固件声明成module范围的作用域

        那么一个模块中所有使用了这个固件的测试方法,仅会整体使用一次固件

                ==》一个模块中所有的测试函数,总会有第一个测试方法被发现,仅在第一个测试方法执行前,先执行测试固件一次

 4)session(会话)--会话范围的作用域

         如果将一个固件声明成session范围的作用域

        那么在一次测试工作的运行过程(会话)中,所有的使用了这个固件的测试函数,仅会整体使用一次固件

        ==》在所有模块中所有的测试函数中,总会有第一个测试函数被发现,仅在第1个第一个测试函数执行前先运行一次固件函数

        ==》如果固件函数中有yield,那么也仅会在所有的测试函数都执行完后,最后执行固件函数中yield语句后剩余的语句

举例一:

     

采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的三层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式校验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
Pytest中的fixture参数是用于创建和管理测试固件的装饰器。它可以在测试函数中作为参数使用,提供可重用的测试环境和数据。 常见的fixture参数有以下几种: 1. autouse:控制fixture的自动使用。如果将其设置为True,则每个测试函数都会自动使用该fixture,而无需显式引用。 2. scope:控制fixture的作用域。可以设置为"function"(默认值,每个测试函数都会调用一次fixture)、"class"(每个测试类都会调用一次fixture)、"module"(每个模块都会调用一次fixture)或"session"(整个测试过程中只会调用一次fixture)。 3. params:允许将多个参数传递给fixture,以便生成不同的测试环境和数据。每个参数都会对应一个独立的fixture实例。 4. autouse、scope和params可以结合使用,以满足不同的测试需求。 示例代码如下: ```python import pytest # 定义一个简单的fixture @pytest.fixture(scope="module") def setup_module(): print("执行 setup_module") # 使用fixture def test_example(setup_module): print("执行 test_example") # 使用autouse=True的fixture @pytest.fixture(autouse=True) def setup_autouse(): print("执行 setup_autouse") # 使用params的fixture @pytest.fixture(params=[1, 2, 3]) def setup_params(request): print(f"执行 setup_params,参数值为{request.param}") # 使用autouse和scope的fixture @pytest.fixture(autouse=True, scope="class") def setup_class(): print("执行 setup_class") # 使用多个fixture def test_multiple_fixtures(setup_module, setup_autouse, setup_params): print("执行 test_multiple_fixtures") ``` 运行上述代码,输出结果如下: ``` 执行 setup_module 执行 setup_autouse 执行 setup_class 执行 setup_params,参数值为1 执行 test_example 执行 setup_params,参数值为2 执行 test_example 执行 setup_params,参数值为3 执行 test_example 执行 test_multiple_fixtures ``` 这是一个简单的示例,演示了如何使用pytest fixture参数来管理测试固件fixture参数可以帮助我们更方便地创建、共享和管理测试环境和数据,提高测试代码的可维护性和复用性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值