• pytest的Fixture使用


    Pytest测试框架最强大的功能除了丰富的第三方插件外,还有就是它的Fixture和共享Fixture的conftest.py

    Fixture一点需要考虑的是初始化与清理,也就是说在一个完整的测试用例中,都必须都得有初始化与清理的部分,这样才是一个完整的测试用例的。Fixture可以很轻松的来解决这部分,还有一点需要说的是Fixture的函数也可以和返回值整合起来,如添加书籍成功后,把数据ID返回来,下面就以查看书籍为案例,那么查看书籍前提是需要添加书籍,这样可以查看,最后把添加的书籍删除,这样一个测试用例执行完成后才符合它的完整流程

    使用fixture装饰器来实现部分用例的前后置

    @pytest.fixture(scope="",params="",autouse="",ids="",name="")
    
    scope:标记的作用域。function(默认)、class、module、package
    params:参数化
    autouse:True自动执行,默认是False
    ids:当使用params参数化时,给每一个值设置一个变量名,意义不大
    name:给标记的方法取一个别名
    
    

    1、scope,默认是 function,针对函数执行前后置方法 (指定某个测试用例添加前后置)

    scope = "function"

    import pytest
    
    @pytest.fixture(scope='function')
    def test_fixture():
        print("\n前置方法,可以实现部分及全部用例的后置")
        yield
        print("\n后置方法,可以实现部分及全部用例的后置")
    
    class Test_01:
        def test_001(self, test_fixture):    # 函数以test_开头
            a = 1
            assert a == 1
    
        def test_002(self):
            b = 2
            assert b == 2
    
    • 生成前后置

    2、scope = "class",针对测试类执行前后置方法 (指定某个测试用例添加前后置)

    import pytest
    
    @pytest.fixture(scope='class')
    def test_fixture():
        print("\n前置方法,可以实现部分及全部用例的后置")
        yield
        print("\n后置方法,可以实现部分及全部用例的后置")
    
    class Test_01:
        def test_001(self, test_fixture):    # 函数以test_开头
            a = 1
            print("test_01 - test_001")
            assert a == 1
    
        def test_002(self):
            b = 2
            print("test_01 - test_002")
            assert b == 2
    
    
    class Test_02:
        def test_001(self):    # 函数以test_开头
            c = 3
            print("test_02 - test_001")
            assert c == 3
    
        def test_002(self):
            d = 4
            print("test_02 - test_002")
            assert d == 4
    

    执行 Test01 测试类的第一个测试方法时,触发 test_fixture 方法,在整个测试类执行完毕后,执行后置方法

    如果 test_fixture 方法放置在 test_002 中,则在执行 test_002 方法触发 test_fixture 方法,在整个测试类执行完毕后,执行后置方法

    import pytest
    
    @pytest.fixture(scope='class')
    def test_fixture():
        print("\n前置方法,可以实现部分及全部用例的后置")
        yield
        print("\n后置方法,可以实现部分及全部用例的后置")
    
    class Test_01:
        def test_001(self):    # 函数以test_开头
            a = 1
            print("test_01 - test_001")
            assert a == 1
    
        def test_002(self, test_fixture):
            b = 2
            print("test_01 - test_002")
            assert b == 2
    
        def test_003(self):
            b = 3
            print("test_01 - test_003")
            assert b == 3
    

    image

    3、autouse自动使用:,给当前文件下的所有测试类内的测试方法添加前后置

    scope="function", autouse=True

    import pytest
    
    @pytest.fixture(scope='function', autouse=True)
    def test_fixture():
        print("\n前置方法,可以实现部分及全部用例的后置")
        yield
        print("\n后置方法,可以实现部分及全部用例的后置")
    
    class Test_01:
        def test_001(self, test_fixture):    # 函数以test_开头
            a = 1
            assert a == 1
    
        def test_002(self):
            b = 2
            assert b == 2
    
    
    class Test_02:
        def test_001(self):    # 函数以test_开头
            c = 3
            assert c == 3
    
        def test_002(self):
            d = 4
            assert d == 4
    
    • 所有方法都加上前后置

    4、scope="class", autouse=True,给当前文件下的所有测试类添加前后置

    scope="function", autouse=True

    import pytest
    
    @pytest.fixture(scope='class', autouse=True)
    def test_fixture():
        print("\n前置方法,可以实现部分及全部用例的后置")
        yield
        print("\n后置方法,可以实现部分及全部用例的后置")
    
    class Test_01:
        def test_001(self):    # 函数以test_开头
            a = 1
            print("test_01 - test_001")
            assert a == 1
    
        def test_002(self):
            b = 2
            print("test_01 - test_002")
            assert b == 2
    
    
    class Test_02:
        def test_001(self):    # 函数以test_开头
            c = 3
            print("test_02 - test_001")
            assert c == 3
    
        def test_002(self):
            d = 4
            print("test_02 - test_002")
            assert d == 4
    

    image

    params,用例可以使用提前准备的参数(需要在每个测试方法继承才能实现)

    scope="class" 时,每次执行测试类,触发获取一个值,每个值均触发一次执行测试类
    scope="function" 时,每次执行测试类,触发获取一个值,每个值均触发一次执行测试类

    import pytest
    
    @pytest.fixture(scope="class", autouse=True, params=['成龙','甄子丹'])
    def my_fixture(request):
        print("\n前置方法,可以实现部分及全部用例的后置")
        yield request.param
        print("\n后置方法,可以实现部分及全部用例的后置")
    
    class Test_01:
        def test_001(self, my_fixture):    # 函数以test_开头
            a = 1
            print("test_01 - test_001 " + my_fixture)
            assert a == 1
    
        def test_002(self, my_fixture):
            b = 2
            print("test_01 - test_002 " + my_fixture)
            assert b == 2
    
    class Test_02:
        def test_001(self):    # 函数以test_开头
            c = 3
            print("test_02 - test_001 ")
            assert c == 3
    
        def test_002(self):
            d = 4
            print("test_02 - test_002 ")
            assert d == 4
    

    想要获取 params 中的值,需要在测试方法中继承 my_fixture 才能使用,因此使用 scope="class", autouse=True 意义不大,在实际应用中,scope、autouse不设置即可

    
    import pytest
    
    @pytest.fixture(params=['成龙','甄子丹'])
    def my_fixture(request):
        print("\n前置方法,可以实现部分及全部用例的后置")
        yield request.param
        print("\n后置方法,可以实现部分及全部用例的后置")
    
    class Test_01:
        def test_001(self, my_fixture):    # 函数以test_开头
            a = 1
            print("test_01 - test_001 " + my_fixture)
            assert a == 1
    
        def test_002(self):
            b = 2
            print("test_01 - test_002 ")
            assert b == 2
    
    class Test_02:
        def test_001(self):    # 函数以test_开头
            c = 3
            print("test_02 - test_001 ")
            assert c == 3
    
        def test_002(self):
            d = 4
            print("test_02 - test_002 ")
            assert d == 4
    

    name:取别名

    通过别名去给测试方法继承

    import pytest
    
    @pytest.fixture(params=['成龙','甄子丹'], name="test_01_class")
    def my_fixture(request):
        print("\n前置方法,可以实现部分及全部用例的后置")
        yield request.param
        print("\n后置方法,可以实现部分及全部用例的后置")
    
    class Test_01:
        def test_001(self, test_01_class):    # 函数以test_开头
            a = 1
            print("test_01 - test_001 " + test_01_class)
            assert a == 1
    
        def test_002(self, test_01_class):
            b = 2
            print("test_01 - test_002 " + test_01_class)
            assert b == 2
    
    class Test_02:
        def test_001(self):    # 函数以test_开头
            c = 3
            print("test_02 - test_001 ")
            assert c == 3
    
        def test_002(self):
            d = 4
            print("test_02 - test_002 ")
            assert d == 4
    

    通过conftest.py和@pytest.fixture()结合使用实现全局的前置应用

    conftest.py文件是单独存放的一个夹具配置文件,名称不能更改。
    用处可以在不同的py文件中使用同一个fixture函数。
    原则上conftest.py需要和运行的用例放到同一层。并且不需要做任何的imprt导入的操作
    上层的 conftest.py 定义的@pytest.fixture() 可以在子级目录的测试类使用
    参考文档:https://www.cnblogs.com/blog-123/p/14893903.html

    conftest.py:

    # conftest.py
    
    import pytest
    
    def read_data():
        return ['sql111','sql222']
    
    @pytest.fixture(params=read_data(), name="wufantest")
    def execute_sql(request):
        print('\n执行sql')
        yield request.param
        print('\n关闭数据库连接')
    

    test_conftest用例类:

    import pytest
    
    class Test04:
        def test_01(self,wufantest):
            print('测试百里守约'+wufantest)
    
        def test_02(self):
            print('测试娜可露露')
    
        def test_03(self):
            print('测试蔡文姬')
    

  • 相关阅读:
    使用DirectX作渲染过程
    记于来北京两个星期
    添加 node mocha 测试模块
    for-of循环
    app-web 开发 追溯debug
    cmd关闭被占用的端口命令及教程详解
    vue使用element-ui的el-input监听不了键盘事件解决
    Nodejs 进阶:Express 常用中间件 body-parser 实现解析
    nodejs设置允许跨域
    nodejs 全局变量和全局对象
  • 原文地址:https://www.cnblogs.com/DeryKong/p/16159564.html
Copyright © 2020-2023  润新知