pytest解读fixture有效性及跨文件共享fixtures

目录
  • fixture有效性及跨文件共享fixtures
    • 一、fixture有效性
    • 二、跨文件共享fixtures

fixture有效性及跨文件共享fixtures

一、fixture有效性

fixture有效性,说白了就是fixture函数只有在它定义的使用范围内,才可以被请求到。比如,在类里面定义了一个fixture,
那么就只能是这个类中的测试函数才可以请求。但是,如果一个fixture定义的范围是整个模块,那么这个模块下的每个测试函数都可以去请求。

这里还有另一个影响fixture有效性的参数autouse=True,默认为False,等于True的话会在其他fixture之前先执行该fixture,后面有需要另起一篇,这里简短带过。

另外,一个fixture函数还可以请求任何其他的fixture函数。不管被请求的那个fixture函数在哪里定义,只要测试函数请求了它们,fixture函数就可以。

看示例代码(为了更直观的看效果,在官方代码基础上我加了几个fixture函数的print):

#  content of test_module1.py
import pytest

@pytest.fixture
def order():
    print("\n运行fixture函数-order")
    return []

@pytest.fixture
def outer(order, inner):
    print("运行fixture函数-outer")
    order.append("outer")

class TestOne:
    @pytest.fixture
    def inner(self, order):
        print("运行TestOne下的fixture-inner")
        order.append("one")

    def test_order(self, order, outer):
        assert order == ["one", "outer"]

class TestTwo:
    @pytest.fixture
    def inner(self, order):
        print("运行TestTwo下的fixture-inner")
        order.append("two")

    def test_order(self, order, outer):
        assert order == ["two", "outer"]

注意:

  • 这里有一个fixture函数outer在测试类的外部
  • 另外还有2个名字都叫inner的fixture函数,分别在测试类TestOneTestTwo中。
  • 在外部的fixture函数outer中,又请求了内部的fixture函数inner

现在我只运行类TestOne,看运行结果:

test_module1.py
运行fixture函数-order
运行TestOne下的fixture-inner
运行fixture函数-outer
.                                                        [100%]

============================== 1 passed in 0.01s ==============================
Process finished with exit code 0

说明测试函数里的断言通过。测试函数执行的时候,外部outer请求的innerTestOne下的。
虽然TestOne类下的inner,只能作用于TestOne下的测试函数。但是,由于测试函数请求了
外部的outer,所以,外部的outer也就可以请到内部的inner

官方还给出一个示意图,可以结合着上述的思路,理解一下。

注意,fixture定义的范围与它将被实例化的顺序无关:实例化顺序由调用逻辑强制执行(可以参考这篇)。

二、跨文件共享fixtures

如果你把fixture函数放到conftest.py文件中,那么在这个文件所在的整个目录下,都可以直接请求里面的fixture,不需要导入。

在实际场景中,我们的测试目录或者包可能有多层的嵌套,这种情况下,每个目录都可以有一个自己的conftest文件。
比如,像这样:

各层级里的内容是这样的:

tests/
    __init__.py

    conftest.py
        # content of tests/conftest.py
        import pytest

        @pytest.fixture
        def order():
            return []

        @pytest.fixture
        def top(order, innermost):
            order.append("top")

    test_top.py
        # content of tests/test_top.py
        import pytest

        @pytest.fixture
        def innermost(order):
            order.append("innermost top")

        def test_order(order, top):
            assert order == ["innermost top", "top"]

    subpackage/
        __init__.py

        conftest.py
            # content of tests/subpackage/conftest.py
            import pytest

            @pytest.fixture
            def mid(order):
                order.append("mid subpackage")

        test_subpackage.py
            # content of tests/subpackage/test_subpackage.py
            import pytest

            @pytest.fixture
            def innermost(order, mid):
                order.append("innermost subpackage")

            def test_order(order, top):
                assert order == ["mid subpackage", "innermost subpackage", "top"]

同样的,这里也有一张作用域边界图帮助理解。

知识点:

  • 顶层下的conftest里的order和top对当前层和下层级的所有可用(一个圈就对应各自的作用域)。
  • 测试函数只可以向上层级搜索可用的fixture函数(出圈),但是出圈查找的过程中,不能再进到别的圈子向下查找。所以,tests/subpackage/test_subpackage.py::test_order可以找到定义在tests/subpackage/test_subpackage.py里的innermost。但是,另一个定义在tests/test_top.py中,名字也叫innermost的fixture,对test_order来说就不可用了。

其实对于上述,按照我的白话来说,想用conftest里的fixture函数,你只能用同层级或者上层级的。但是上级里的其他兄弟目录或者包,以及他们的下层级的conftest,你是不能用的。

但是读了官方文档,我觉得官方的那个圈子描述挺不错的,更严谨。

以上就是pytest解读fixture有效性及跨文件共享fixtures的详细内容,更多关于 pytest解读fixture fixtures的资料请关注我们其它相关文章!

(0)

相关推荐

  • pytest fixtures装饰器的使用和如何控制用例的执行顺序

    pytest fixtures装饰器 pytest中可以使用@pytest.fixture 装饰器来装饰一个方法,被装饰方法的方法名可以作为一个参数传入到测试方法中.可以使用这种方式来完成测试之前的初始化,也可以返回数据给测试函数. 将fixture作为函数参数 通常使用setup和teardown来进行资源的初始化,如果有这样一个场景,测试用例1需要依赖登入功能,测试用例2不需要依赖登入功能,测试用例3需要登入功能,这种场景setup,teardown无法实现,也可以使用pytest fixt

  • Django单元测试中Fixtures的使用方法

    在使用单元测试时,有时候需要测试数据库中有数据,这时我们可以使用Django的Fixtures来生成测试数据. 在对Django项目做单元测试时,我们需要一些初始的数据来作为检测结果的依据,那么对于我们已经有正式数据库的模块来说,使用Fixture载入数据是简单有效的方法. 首先,你需要一份json格式的数据文件,Django对此提供了很好的支持-dumpdata 命令: python manage.py dumpdata myapp >myapp/fixtures/myapp.json # 这

  • pytest fixtures函数及测试函数的参数化解读

    目录 pytest fixtures测试函数参数化 一.@pytest.mark.parametrize:参数化测试函数 1. 常规用法 2. 在参数化中标记单个测试实例 3. 多个参数化组合,笛卡尔积 二.用钩子函数pytest_generate_tests example拓展 总结 pytest fixtures测试函数参数化 Pytest会在以下几个级别启用测试参数化: pytest.fixture(),可以对fixture函数进行参数化. @pytest.mark.parametrize

  • Django单元测试中Fixtures用法详解

    在使用单元测试时,有时候需要测试数据库中有数据,这时我们可以使用Django的Fixtures来生成测试数据. Django是一个开放源代码的Web应用框架,由Python写成.采用了MVT的软件设计模式,即模型Model,视图View和模板Template.2005年7月在BSD许可证下发布. 在对Django项目做单元测试时,经常需要生成或者导入一些初始数据.对于已经有数据存在于正式数据库的app来说,使用Fixture 载入数据,是最简便有效的方法. 本文通过配置myapp.json,te

  • pytest解读fixture有效性及跨文件共享fixtures

    目录 fixture有效性及跨文件共享fixtures 一.fixture有效性 二.跨文件共享fixtures fixture有效性及跨文件共享fixtures 一.fixture有效性 fixture有效性,说白了就是fixture函数只有在它定义的使用范围内,才可以被请求到.比如,在类里面定义了一个fixture,那么就只能是这个类中的测试函数才可以请求.但是,如果一个fixture定义的范围是整个模块,那么这个模块下的每个测试函数都可以去请求. 这里还有另一个影响fixture有效性的参

  • pytest解读一次请求多个fixtures及多次请求

    目录 一.一个测试函数/fixture一次请求多个fixture 二.每个测试函数可以多次请求fixtures(返回值被缓存) 跟着节奏继续来探索fixtures的灵活性. 一.一个测试函数/fixture一次请求多个fixture 在测试函数和fixture函数中,每一次并不局限于请求一个fixture.他们想要多少就可以要多少. 下面是另一个简单的例子: import pytest # Arrange @pytest.fixture def first_entry(): return "a&

  • pytest官方文档解读fixture的调用方式

    目录 pytest官方文档fixtures调用 一.测试函数声明传参请求fixture 二.fixture中的返回值传递给测试函数 pytest官方文档fixtures调用 既然fixtures是给执行测试做准备工作的,那么pytest如何知道哪些测试函数 或者 fixtures要用到哪一个fixtures呢?说白了,就是fixtures的调用. 一.测试函数声明传参请求fixture 测试函数通过将fixture声明为参数来请求fixture. def test_my_fruit_in_bas

  • pytest官方文档解读Fixture errors抛错解决

    既然fixtures函数也是咱们自己写的,那难免会发生异常,当fixture函数异常后,pytest中如何处理呢? 首先,在pytest中,如果一个测试函数中传入了多个fixture函数,那么pytest会尽可能的按线性顺序先后执行.如果,先执行的fixture函数有问题引发了异常,那么pytest将会停止执行这个测试函数的fixture,并且标记此测试函数有错误. 但是,当测试被标记为有错误时,并不是说这个测试函数的结果失败了,这仅仅意味着测试函数所依赖的fixture有问题,导致测试函数不能

  • pytest解读fixtures中yield与addfinalizer区别

    目录 前言 一.问题回顾 二.问题解决 前言 在上一章中,文末留下了一个坑待填补,疑问是这样的: 目前从官方文档中看到的是 We have to be careful though, because pytest will run that finalizer once it’s been added, even if that fixture raises an exception after adding the finalizer. 一旦添加了终结器,pytest便会执行. 但是,当我尝试

  • pytest中fixture函数使用

    目录 前言 fixture函数 fixture的使用 前言 setup和teardown能实现在测试用例执行之前或之后做一些操作,但是这种是整个测试脚本全局生效的: 如果我们想实现某些用例执行之前进行登录,某些用例执行之前不需要进行登录,这种场景我们再使用setup和teardown就无法实现了,这时候我们就需要用到fixture功能了. fixture函数 fixture(scope="function", params=None, autouse=False, ids=None,

  • pytest解读fixtures之Teardown处理yield和addfinalizer方案

    目录 前言 一.yield fixtures(推荐) 1, yield 和 return 2, yield的执行顺序 二.addfinalizer 1.request.addfinalizer把函数变成终结器 2.request.addfinalizer注册多个终结器函数 3.yield和addfinalizer的区别 前言 当我们运行测试函数时,我们希望确保测试函数在运行结束后,可以自己清理掉对环境的影响.这样的话,它们就不会干扰任何其他的测试函数,更不会日积月累的留下越来越多的测试数据. 用

  • pytest自动化测试fixture的作用域实例化顺序及可用性

    目录 1. fixture的作用域 1.1 scope 1.function: 2.class: 3.module: 4.package: 5.session: 1.2 动态作用域(Dynamic scope) 1.带参数-k运行 2.无参数-k运行 2. fixture的实例化顺序 2.1 作用域级别高的fixture先执行 2.2 fixture函数的依赖项先执行 2.3 自动使用的fixture在其作用域内首先执行 本节总结 3. fixture的可用性 1. fixture的作用域 1.

  • pytest官方文档解读fixtures调用fixtures及fixture复用性

    目录 fixtures调用其他fixtures及fixture复用性 一.Fixtures调用别的Fixtures 二.Fixtures的复用性 fixtures调用其他fixtures及fixture复用性 pytest最大的优点之一就是它非常灵活. 它可以将复杂的测试需求简化为更简单和有组织的函数,然后这些函数可以根据自身的需求去依赖别的函数. fixtures可以调用别的fixtures正是灵活性的体现之一. 一.Fixtures调用别的Fixtures 直接看一个简单示例: import

  • pytest官方文档解读fixtures

    目录 一.测试的构成 二.回到fixtures本身 在深入了解fixture之前,让我们先看看什么是测试. 一.测试的构成 其实说白了,测试就是在特定的环境.特定的场景下.执行特定的行为,然后确认结果与期望的是否一致. 就拿最常见的登录来说,完成一次正常的登录场景,需要可用的测试环境,可以正常登录的账号和密码.然后,用这个账号密码进行登录操作,结果登录成功,符合这次正常登录场景的预期结果,测试完成. 这样看来,通常就可以把测试分为4个步骤: Arrange Act Assert Cleanup

随机推荐