pytest-24-fixture的作用范围(scope)

fixture作用范围

fixture里面有个scope参数可以控制fixture的作用范围:session > module > class > function

fixture(scope="function", params=None, autouse=False, ids=None, name=None):
    """使用装饰器标记fixture的功能
     ** 作者:上海-悠悠 QQ交流群:588402570**
     可以使用此装饰器(带或不带参数)来定义fixture功能。 fixture功能的名称可以在以后使用
     引用它会在运行测试之前调用它:test模块或类可以使用pytest.mark.usefixtures(fixturename标记。
     测试功能可以直接使用fixture名称作为输入参数,在这种情况下,夹具实例从fixture返回功能将被注入。

    :arg scope: scope 有四个级别参数 "function" (默认), "class", "module" or "session".

    :arg params: 一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它

    :arg autouse:  如果为True,则为所有测试激活fixture func 可以看到它。 如果为False(默认值)则显式需要参考来激活fixture

    :arg ids: 每个字符串id的列表,每个字符串对应于params 这样他们就是测试ID的一部分。 如果没有提供ID它们将从params自动生成

    :arg name:   fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽; 解决这个问题的一种方法是将装饰函数命名
                       “fixture_ <fixturename>”然后使用”@ pytest.fixture(name =‘<fixturename>‘)“”。
  • function 每一个函数或方法都会调用
  • class 每一个类调用一次,一个类可以有多个方法
  • module,每一个.py文件调用一次,该文件内又有多个function和class
  • session 是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module

scope="function"

@pytest.fixture()如果不写参数,默认就是scope="function",它的作用范围是每个测试用例来之前运行一次,销毁代码在测试用例运行之后运行。

import pytest

@pytest.fixture()
def first():
    print("\n获取用户名")
    a = "yoyo"
    return a

@pytest.fixture(scope="function")
def sencond():
    print("\n获取密码")
    b = "123456"
    return b

def test_1(first):
    ‘‘‘用例传fixture‘‘‘
    print("测试账号:%s" %first)
    assert first == "yoyo"

def test_2(sencond):
    ‘‘‘用例传fixture‘‘‘
    print("测试密码:%s" %sencond)
    assert sencond == "123456"

if __name__ == "__main__":
    pytest.main(["-s", "test_fixture7.py"])

运行结果:

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: D:\YOYO\fixt, inifile:
plugins: rerunfailures-4.1, metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 2 items

test_fixture7.py
获取用户名
测试账号:yoyo
.
获取密码
测试密码:123456
.

========================== 2 passed in 0.01 seconds ===========================

用例放到类里面也一样

import pytest

@pytest.fixture()
def first():
    print("\n获取用户名")
    a = "yoyo"
    return a

@pytest.fixture(scope="function")
def sencond():
    print("\n获取密码")
    b = "123456"
    return b

class TestCase():
    def test_1(self, first):
        ‘‘‘用例传fixture‘‘‘
        print("测试账号:%s" % first)
        assert first == "yoyo"

    def test_2(self, sencond):
        ‘‘‘用例传fixture‘‘‘
        print("测试密码:%s" % sencond)
        assert sencond == "123456"

if __name__ == "__main__":
    pytest.main(["-s", "test_fixture7.py"])

scope="class"

fixture为class级别的时候,如果一个class里面有多个用例,都调用了此fixture,那么此fixture只在该class里所有用例开始前执行一次

import pytest

@pytest.fixture(scope="class")
def first():
    print("\n获取用户名,scope为class级别只运行一次")
    a = "yoyo"
    return a

class TestCase():
    def test_1(self, first):
        ‘‘‘用例传fixture‘‘‘
        print("测试账号:%s" % first)
        assert first == "yoyo"

    def test_2(self, first):
        ‘‘‘用例传fixture‘‘‘
        print("测试账号:%s" % first)
        assert first == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_fixture9.py"])

运行结果:

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: D:\YOYO\fixt, inifile:
plugins: rerunfailures-4.1, metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 2 items

test_fixture9.py
获取用户名,scope为class级别只运行一次
测试账号:yoyo
.测试账号:yoyo
.

========================== 2 passed in 0.13 seconds ===========================

scope="module"

fixture为module级别时,在当前.py脚本里面所有用例开始前只执行一次

import pytest

@pytest.fixture(scope="module")
def first():
    print("\n获取用户名,scope为module级别当前.py模块只运行一次")
    a = "yoyo"
    return a

def test_1(first):
    ‘‘‘用例传fixture‘‘‘
    print("测试账号:%s" % first)
    assert first == "yoyo"

class TestCase():
    def test_2(self, first):
        ‘‘‘用例传fixture‘‘‘
        print("测试账号:%s" % first)
        assert first == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_fixture10.py"])

运行结果

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: D:\YOYO\fixt, inifile:
plugins: rerunfailures-4.1, metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 2 items

test_fixture10.py
获取用户名,scope为module级别当前.py模块只运行一次
测试账号:yoyo
.测试账号:yoyo
.

========================== 2 passed in 0.14 seconds ===========================

scope="session"

fixture为session级别是可以跨.py模块调用的,也就是当我们有多个.py文件的用例时候,如果多个用例只需调用一次fixture,那就可以设置为scope="session",并且写到conftest.py文件里

conftest.py文件名称是固定的,pytest会自动识别该文件。放到工程的根目录下,就可以全局调用了,如果放到某个package包下,那就只在该package内有效

conftest.py

import pytest

@pytest.fixture(scope="session")
def first():
    print("\n获取用户名,scope为session级别多个.py模块只运行一次")
    a = "yoyo"
    return a

test_fixture11.py和test_fixture12.py用例脚本

test_fixture11.py

import pytest
def test_1(first):
    ‘‘‘用例传fixture‘‘‘
    print("测试账号:%s" % first)
    assert first == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_fixture11.py"])

import pytest

def test_2(first):
    ‘‘‘用例传fixture‘‘‘
    print("测试账号:%s" % first)
    assert first == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_fixture12.py"])

如果想同时运行test_fixture11.py和test_fixture12.py,在cmd执行

pytest -s test_fixture11.py test_fixture12.py

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: D:\YOYO\fixt, inifile:
plugins: rerunfailures-4.1, metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 2 items

test_fixture11.py .                                                      [ 50%]
test_fixture12.py .                                                      [100%]

========================== 2 passed in 0.03 seconds ===========================

D:\YOYO\fixt>pytest -s test_fixture11.py test_fixture12.py
============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: D:\YOYO\fixt, inifile:
plugins: rerunfailures-4.1, metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 2 items

test_fixture11.py
获取用户名,scope为session级别多个.py模块只运行一次
测试账号:yoyo
.
test_fixture12.py 测试账号:yoyo
.

========================== 2 passed in 0.03 seconds ===========================

原文地址:https://www.cnblogs.com/jason89/p/10323760.html

时间: 2024-11-03 07:01:39

pytest-24-fixture的作用范围(scope)的相关文章

pytest之fixture使用详解

简介: fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进: 1.有独立的命名,并通过声明它们从测试函数.模块.类或整个项目中的使用来激活. 2.按模块化的方式实现,每个fixture都可以互相调用. 3.fixture的范围从简单的单元测试到复杂的功能测试,可以对fixture配置参数,或者跨函数function,类class,模块module或整个测试session范围. fixture可以当做参数传入 定义fixture跟定义普通函数差不多,唯一区

pytest框架: fixture之conftest.py

原文地址:https://blog.csdn.net/BearStarX/article/details/101000516 一.fixture优势1.fixture相对于setup和teardown来说应该有以下几点优势: 命名方式灵活,不局限于setup和teardown这几个命名 conftest.py配置 里可以实现数据共享,不需要import就能自动找到一些配置 scope="module"可以实现多个.py跨文件共享前置 scope="session"以

深入Asyncio(十二)Asyncio与单元测试

Testing with asyncio 之前有说过应用开发者不需要将loop当作参数在函数间传递,只需要调用asyncio.get_event_loop()即可获得.但是在写单元测试时,可能会需要用多个loop(每个测试用一个单独的loop),问题来了:是否为了支持单元测试而要将loop作为函数参数传入呢? 先看个例子. import asyncio from typing import Callable async def f(notify: Callable[[str], None]):

pytest框架之fixture详细使用

本人之前写了一套基于unnitest框架的UI自动化框架,但是发现了pytest框架之后觉得unnitest太low,现在重头开始学pytest框架,一边学习一边记录,和大家分享,话不多说,那就先从pytest框架的精髓fixture说起吧! 简介: fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进: 1.有独立的命名,并通过声明它们从测试函数.模块.类或整个项目中的使用来激活. 2.按模块化的方式实现,每个fixture都可以互相调用. 3.fixt

pytest.fixture的初始化清除操作

需要导入模块pytest 使用装饰器:pytest.fixture(scope='function',autouse=False) fixture()函数参数解释说明 fixture里面有个scope参数可以控制fixture的作用范围:session>module>class>function -function:每一个函数或方法都会调用 -class:每一个类调用一次,一个类中可以有多个方法 -module:每一个.py文件调用一次,该文件内又有多个function和class -s

用 pytest 测试 python 代码

Pytest 是一个比较成熟且功能完备的 Python 测试框架.其提供完善的在线文档,并有着大量的第三方插件和内置帮助,适用于许多小型或大型项目.Pytest 灵活易学,打印调试和测试执行期间可以捕获标准输出,适合简单的单元测试到复杂的功能测试.还可以执行 nose, unittest 和 doctest 风格的测试用例,甚至 Django 和 trial.支持良好的集成实践, 支持扩展的 xUnit 风格 setup,支持非 python 测试.支持生成测试覆盖率报告,支持 PEP8 兼容的

Fixture:显式,模块化,可扩展

fixture: 夹具是指机械制造过程中用来固定加工对象,使之占有正确的位置,以接受施工或检测的装置,又称卡具(qiǎ jǜ).从广义上说,在工艺过程中的任何工序,用来迅速.方便.安全地安装工件的装置,都可称为夹具. 测试夹具是为了给测试脚本提供一个固定的基准. 可以理解为使测试脚本可以重复.可靠地调用这些夹具进行组装测试脚本.(如果有经典的xunit样式中的setup和teardown概念,可以看作是对这两个东西的进一步的封装,细化各个预置和清理步骤,方便更灵活的组装测试脚本构成) 通过从测试

python学习-pytest(二)-conftest.py

一.conftest特点: 1.可以跨.py文件调用,有多个.py文件调用时,可让conftest.py只调用了一次fixture,或调用多次fixture 2.conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件 3.不需要import导入 conftest.py,pytest用例会自动识别该文件,放到项目的根目录下就可以全局目录调用了,如果放到某个package下,那就在改package内有效,可有多个conftest.py 4.conftest.py

pytest框架[email&#160;protected](scpoe=‘xxx&#39;)装饰器

pytest是一个非常成熟的全功能的Python测试框架 用例设计原则 谨记:当我们使用pytest框架写case的时候,一定要拿它的命令规范去case,这样框架才能识别到哪些case需要执行,哪些不需要执行文件名以test_.py文件和_test.py以Test开头的类以test_开头的函数以test_开头的方法 运行方式可以通过pycharm里的终端命令,也可以pytest.main()运行(主推) @pytest.fixture() 即测试用例执行的环境准备和清理,相当于unittest的