Pytest Fixture详解

本文详细介绍了Pytest中的Fixture,包括其作为测试用例前后置操作的用途、用法、异常处理、多fixture使用、fixture互相调用以及五个关键参数:name、scope、autouse、params、ids的详解。通过实例展示了Fixture在自动化测试中的重要作用,如在登录操作、参数化和作用域控制等方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 前言

  在做自动化的过程中,编写用例时候需要用到用例的前置和用例的后置,其中pytest中有setup_class和teardown_class可以帮助我们完成这些,但是不够完善而且灵活性不够强。举个简单的例子,一个calss中有3条用例,其中2条需要登录,1条不需要登录,这个时候如果在用setup和teardown来做就有点不方便。这个时候就引入了新的知识点fixture。

Fixture简单介绍

  fixture属于pytest中的一个方法。fixture可以用作测试用例的前置和后置操作,其中fixture命令规范没有像setup和teardown固定格式。可以随意命名。控制fixture的前置和后置操作是通过yield关键字进行来区分的代码在yield前面的属于前置操作,代码在yield后面的属于后置操作。并且fixture也没有强烈的要求必须要前后置同时存在,可以只存在前置也可以只存在后置。fixture如果有后置内容,无论遇到什么问题,都会进行执行后置的代码。

return和yeild的区别: 都是表示返回值的意思,但是return的后面不能有代码,yeild很后面可以有代码

yield语句之前的就会在测试用例之前使用,yield之后的语句就会在测试用例执行完成之后再执行。

常见的应用场景:

  1. @pytest.fixture可以用在selenium中测试用例执行前后打开、关闭浏览器的操作; yield返回driver对象去操作浏览器;
  2. @pytest.fixture可以用在接口自动化测试中操作登录,yield返回token;

fixture中一共有5个参数分别是:scope,params,autouse,ids,name

fixture使用方法

  前面已经介绍了fixture是干什么的,但是具体的用法没有说,先介绍下具体用法,这里通过将登录操作写在一个函数中。然后通过装饰器的方法进行使其变成fixture。那条用例需要用到对应的前置和后置操作的时,直接将fixture的名称通过传参的形式放到用例中。

一个class中存在3条用例,其中2条需要登录,1条不需要登录。运营fixture进行完成前后置操作。

import pytest
@pytest.fixture()
def login():
    print("log In")
    yield "Token:xxxxxxxxxxxxxxxxx" #yield之前的内容是setup的相关内容,之后的内容是teardown的操作
    print("Log out")

class TestFixture:

    def test_case001(self,login):
        assert 1==1
        
      def test_case002(self):
        assert 1==1

    def test_case003(self,login):
### 使用 PytestFixture 进行单元测试 Pytest 提供了一种灵活的方式来管理测试所需的资源或上下文,这便是 `fixture` 功能。以下是关于如何在 pytest 中使用 fixture 进行单元测试的具体说明。 #### 1. 基本概念 Fixture 是一种特殊的函数,在测试运行之前自动调用以提供必要的初始化工作,并可在测试完成后执行清理操作。通过装饰器 `@pytest.fixture()` 定义一个 fixture 函数[^3]。 #### 2. 自动应用的 Fixture 可以通过设置参数 `autouse=True` 来让某个 fixture 对当前模块下的所有测试生效而无需显式声明。例如: ```python import pytest @pytest.fixture(autouse=True) def before(): print("\n--------before fixture has ran--------") class Test_A: def test_a(self): print('-------test_a has ran-------') assert 1 def test_b(self): print('-------test_b has ran-------') assert 1 if __name__ == '__main__': pytest.main(['-s', 'test_fixture.py']) ``` 上述代码定义了一个名为 `before` 的 fixture 并将其设为全局适用。每次运行测试时都会打印提示信息[^1]。 #### 3. 参数化 Fixture 可以利用 `params` 和 `ids` 属性实现参数化的 fixture。这样可以让单个测试针对不同的输入多次运行。例如: ```python import pytest @pytest.fixture(params=[1, 2, 3], ids=['id1', 'id2', 'id3']) def my_parametrized_fixture(request): return request.param def test_parametrized_fixture(my_parametrized_fixture): print(f"Running test with {my_parametrized_fixture}") ``` 在这个例子中,`test_parametrized_fixture` 将会被执行三次,分别对应于 `[1, 2, 3]` 的每一个值[^4]。 #### 4. Scope 控制 Fixture 可以有不同的作用域 (`scope`),控制其生命周期范围。常见的 scope 类型有: - **function**: 每次测试函数都重新创建一次 (默认行为)[^3]。 - **module**: 整个模块只创建一次。 - **session**: 跨越整个会话周期仅创建一次。 示例代码如下所示: ```python import pytest @pytest.fixture(scope="module") def module_level_fixture(): print("\nModule level setup") yield print("\nModule level teardown") def test_one(module_level_fixture): print("Test one executed") def test_two(module_level_fixture): print("Test two executed") ``` 这里展示了如何在一个模块级别共享同一个 fixture 实例。 --- ### 总结 Pytestfixture 功能极大地简化了复杂测试场景下所需的数据准备和环境配置过程。无论是简单的前置条件还是复杂的多级依赖关系都可以轻松处理。合理运用不同类型的 fixtures 不仅能提升代码质量还能增强可读性和维护效率。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值