首页 > 其他分享 >Pytest - Fixture(5) - 作用域(scope)

Pytest - Fixture(5) - 作用域(scope)

时间:2023-05-27 10:34:51浏览次数:37  
标签:用例 作用域 py fixture print Pytest test scope

Pytest - Fixture作用域(scope)

  • 之前讲过,fixture里面有个 scop 参数,这个参数就是填写fixture作用域的;

    • function:每一个函数或方法都会调用;

    • class:每一个类调用一次,一个类中可以有多个方法;

    • module:每一个.py 文件调用一次,该文件内又有多个 function class

    • session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module


function

  • fixture默认作用域function,即 scope="function",scope可以不写。

    • 每一个函数或方法执行前都会调用,每个测试用例执行前都会执行一次function级别的fixture;

test_py.py

import pytest

"""用例级别fixture,作用域单个用例"""
@pytest.fixture(autouse=True)
def login_func():
    print("\n--- function级别的作用域前置操作 ---")
    yield
    print("=== function级别的作用域后置操作 ===")

# 调用login的fixture函数
def test_s1(login_func):
    print("\n用例test_s1:调用login_func的fixture函数")

# 不调用login函数,也会运行fixture
def test_s2():
    print("\n用例test_s2:不调用login_func函数,也会运行fixture")

if __name__ == '__main__':
    pytest.main(['-q', 'test_py.py'])

class

  • class级别的fixture,在整个测试类中的所有测试用例——都会调用fixture函数。

    • 在类中的测试用例,任意一个用例引用fixture即可:

    test_py.py

    import pytest
    
    """类级别fixture,作用域整个类"""
    @pytest.fixture(scope="class")
    def login_cls():
        print("\n--- class级别的作用域前置操作 ---")
        yield
        print("=== class级别的作用域后置操作 ===")
    
    
    class Test_cls():
    
        # class级别的fixture任意一个用例引用即可
        def test_s1(self, login_cls):
            print("\n用例test_s1:在类中的测试用例")
    
        def test_s2(self):
            print("\n用例test_s2:在类中的测试用例")
    
    if __name__ == '__main__':
        pytest.main(['-q', 'test_py.py'])
        
    

    • 在类外的测试用例调用fixture,相当于function级别的fixture:

    test_py.py

    import pytest
    
    """类级别fixture,作用域整个类"""
    @pytest.fixture(scope="class", autouse=True)
    def login_cls():
        print("\n--- class级别的作用域前置操作 ---")
        yield
        print("=== class级别的作用域后置操作 ===")
    
    """类外调用class级别的作用域,相当于function级别的作用域"""
    def test_s1(login_cls):
        print("\n用例test_s1:在类外的测试用例,调用login_cls的fixture函数")
    
    def test_s2():
        print("\n用例test_s2:在类外的测试用例,不调用login_cls函数,也会运行fixture")
    
    if __name__ == '__main__':
        pytest.main(['-q', 'test_py.py'])
        
    

module

  • 在Python中 modulexx.py文件;当fixture定义为module时,则此fixture将在当前py文件中起作用

    • 当fixture定义为module作用域时,只要当前文件中有一个测试用例使用了fixture,不管这个用例是在类外,还是在类中,都会在当前文件(模块)的所有测试用例执行之前去执行fixture定义的行为;

    • 以及当前文件的所有用例结束之后同样去执行fixture定义的对应操作。

test_py.py

import pytest

"""模块级别fixture,作用域整个py文件"""
@pytest.fixture(scope="module")
def login_module():
    print("\n--- module级别的作用域前置操作 ---")
    yield
    print("=== module级别的作用域后置操作 ===")


# 测试类外和测试类内的函数方法都调用了相同module级别的fixture,但整个py文件只会生效一次fixture。
def test_s2(login_module):
    print("\n用例test_s2:在类外的测试用例")


class Test_cls():
    # module级别的fixture任意一个用例引用即可
    def test_s1(self, login_module):
        print("\n用例test_s1:在类中的测试用例")

    def test_s3(self):
        print("\n用例test_s3:在类中的测试用例")

if __name__ == '__main__':
    pytest.main(['-q', 'test_py.py'])


session

  • session级别的fixture,是指在当前目录下的所有用例之前和之后执行fixture对应的操作;

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

conftest.py

import pytest

"""会话级别fixture,作用域当前目录"""
@pytest.fixture(scope="session")
def login_session():
    """作用于整个py文件"""
    print("\n--- session级别的作用域前置操作 ---")
    yield
    print("=== session级别的作用域后置操作 ===")

test_py.py

def test_s2(login_session):
    print("\n用例test_s2:在类外的测试用例")

class Test_cls():
    # session级别的fixture任意一个用例引用即可
    def test_s1(self, login_session):
        print("\n用例test_s1:在类中的测试用例")

    def test_s3(self):
        print("\n用例test_s3:在类中的测试用例")

if __name__ == '__main__':
    pytest.main(['-q', 'test_py.py'])


标签:用例,作用域,py,fixture,print,Pytest,test,scope
From: https://www.cnblogs.com/mzline/p/17435332.html

相关文章

  • Pytest - Fixture(3) - yield遇到异常
    Pytest-yield遇到异常如果yield前面的代码,即setup部分已经抛出异常了,则不会执行yield后面的teardown内容;如果测试用例抛出异常,yield后面的teardown内容还是会正常执行;test_py.pyimportpytest#配置自动运行的[email protected](scope="function",autouse=Tr......
  • python 名称空间与作用域(笔记整理)
    一、名称空间什么是名称空间:名称空间就是存放变量名和变量值绑定关系的地方就是内存地址在程序执行期间最多会存在三种名称空间:内置名称空间:是Python解释器默认预定义大量内置函数和内置异常的名称空间,就是存放解释器自带函数方法的名称空间可以通过dir(builtins)来......
  • 【深度剖析】JavaScript中块级作用域与函数作用域
    前言系列首发于公众号『前端进阶圈』,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。面试官必问系列:深入理解JavaScript块和函数作用域在JavaScript中,究竟是什么会生成一个新的作用域,只有函数才会生成新的作用域吗?那JavaScript其他结构能生成新的作用域吗?3.1......
  • Pytest - Fixture(2) - 实现setup和teardown(yield)
    Fixture实现setup和teardown(yield)用fixture实现teardown并不是一个独立的函数,而是用yield函数来开启teardown操作;具体yield是什么,可以去度娘一下~test_py.pyimportpytest#配置自动运行的[email protected](scope="function",autouse=True)defo......
  • Pytest - Fixture(1) - 入门&概述
    Pytest-Fixture入门&概述之前讲过测试用例的前置和后置的方法,可以使用setup和teardown函数实现,但是这种方法是用于全部测试用例的;当我有部分测试用例不需要setup的方法该怎么办?pytest提供了fixture方法,让我们可以自定义测试用例的前置及后置条件;还可以根据配置......
  • maven项目pom中scope类型
    1.compile:默认值他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去2.test:依赖项目仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit3.runtime:表示被依赖项目无需参与项目的编译,不过......
  • Pytest - setup 和 teardown
    Pytest-setup和teardown执行用例肯定有些需要前置条件或后置操作,例如前置的用户登陆,后置的清理数据等操作;unittest提供了两种前置(setup、setupClass)和两种后置(teardown、teardownClass);相比之下,pytest提供了十种setup和teardown方法:模块级别:setup_module、te......
  • Pytest - 断言判断(2) - 断言失败继续执行(pytest-assume)
    断言失败继续执行前言一般情况下我们在使用assert断言失败后,后面的代码就不会继续运行;如果我们想要在断言失败后想要继续运行代码,就不能使用assert进行验证;一个可以允许pytest测试用例中,执行多个失败的断言的插件:多重断言pytest-assume安装pipinstallpytest......
  • Pytest - pytest 命令(1) - 命令执行方法
    命令执行方法讲解下pytest分别在Windows,Linux,Pycharm中,执行pytest的方法;追加的参数可以参考:Pytest-pytest命令(2)-命令参数及含义Pytest-pytest命令(3)-常用命令的使用Windows执行Windows下执行pytest测试脚本没什么难度,在用例的目录下打开cmd窗口......
  • pytest + yaml 框架 -29.模板过滤器语法与自定义过滤器使用
    前言v1.2.6版本支持模板过滤器语法的使用,并且可以自定义过滤器了。针对有同学提到上个接口返回一个id值,下个接口引用变量的时候需要根据这个值做一些运算,比如在引用的结果加1.jinja2是可以支持模板过滤器语法的,本篇介绍下模板过滤器的相关使用.v1.2.6版本主要更新以下几点1......