美文网首页
Python测试框架:pytest之fixture使用浅析

Python测试框架:pytest之fixture使用浅析

作者: 闲酿星河 | 来源:发表于2021-10-29 23:56 被阅读0次

         fixture通过装饰函数,使函数名可以作为变量传递给测试用例,最终在执行测试用例之前执行这个装饰过的函数。可以替代unittest里面的setup和teardown。

    @pytest.fixture(scope = "function",params=None,autouse=False,ids=None,name=None)

    参数使用说明:

    scope:用于控制fixture的作用范围,默认为function。

    • function函数级 每一个函数或方法都会调用
    • class 类级别 每个测试类只运行一次
    • module 模块级 每一个.py文件调用一次
    • session 会话级 每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法

    排序为:session > module > class > function

    params:可选参数列表,默认为None。在执行用例时会循环调用parame内的参数。使用时必须使用request.parame的写法。
    ids:配合和参数化一起使用,给用例分配id,用来描述测试用例的标题。
    name:给fixture装饰的函数使用别名。

    使用举例:

    @pytest.fixture()

    import pytest
    # 
    @pytest.fixture()
    def login():
        print("执行登录操作")
    
    
    class Testlogin():
        def test_01(self, login):
            print("用例一")
    
        def test_02(self, login):
            print("用例二")
    
    
    if __name__ == '__main__':
        pytest.main(['-s', 'testdemo.py'])
    
    # 输出为
    >>>testdemo.py 执行登录操作
    用例一
    .执行登录操作
    用例二  
    

    fixture的默认作用域为function,可以看出此时被fixture装饰的函数作为参数被引用时,会在执行函数前执行被装饰的函数。

    @pytest.fixture(scope='class')作用域函数,在整个函数内调用且只调用一次。

    import pytest
    
    @pytest.fixture(scope='class')
    def login():
        print("执行登录操作")
    
    
    class Testlogin():
        def test_01(self, login):
            print("用例一")
    
        def test_02(self, login):
            print("用例二")
    
    
    if __name__ == '__main__':
        pytest.main(['-s', 'testdemo.py'])
    
    # 输出
    >>>testdemo.py 执行登录操作
    用例一
    .用例二
    .
    
    

    当scope的作用域为class时,当类里第一个test_01使用用fixture装饰的函数为参数login前调用一次,之后的test_02再次调用时未执行login函数

    @pytest.fixture(scope='module')整个模块调用且只调用一次

    import pytest
    
    @pytest.fixture(scope='module')
    def login():
        print("执行登录操作")
    
    def test_first(login):
        print('调用第一次')
    
    class Testlogin():
        def test_01(self, login):
            print("用例一")
    
        def test_02(self, login):
            print("用例二")
    
    
    if __name__ == '__main__':
        pytest.main(['-s', 'testdemo.py'])
    
    # 输出
    >>>testdemo.py 执行登录操作
    调用第一次
    .用例一
    .用例二
    

    当作用域为module时,可以看出在test_firsrt第一次调用前调用了fixture装饰的login函数,在之后再次使用login参数时未调用login函数

    @pytest.fixture(scope='session')
    跨多个.py文件,若多个模块调用也只允许一次。结合conftest.py使用。pytest会自动识别conftest.py文件。

    conftest.py代码

    conftest.py
    
    import pytest
    
    @pytest.fixture(scope='session')
    def login():
        print("执行登录操作")
    

    在文件test_demo.py 和 test_demo2.py 两个文件内使用login参数,文件与conftest.py在一个包内。

    test_demo.py 
    
    import pytest
    
    def test_01(login):
        print('用例一')
    
    
    
    test_demo2.py
    
    import pytest
    
    def test_02(login):
        print("用例二")
    
    >>> pytest -s
    test_demo.py 执行登录操作
    用例一
    .
    test_demo2.py 用例二
    .
    
    

    可以看出当scope='session'时,两个文件内只调用了一次login函数

    @pytest.fixture(name='login_name')
    使用name时,使用设置的别名login_name作为参数,而且此时再使用login作为参数会报错。

    import pytest
    
    @pytest.fixture(name='login_name')
    def login():
        print('登录')
    
    class Testlogin():
        def test_01(self, login_name):
            print("用例一")
    
    

    @pytest.fixture(params=['参数1', '参数2'], ids=["id-01", "id-02"])
    使用params时,必须使用request.param获取参数。
    ids可以结合params使用,给每一个params'指定一个id,这个id会变成用例的一部分。

    import pytest
    
    @pytest.fixture(params=['参数1', '参数2'], ids=["id-01", "id-02"])
    def testdemo(request):
        return request.param
    
    class Testlogin():
        def test_01(self, testdemo):
            print(testdemo)
    
    
    >>>pytest -vs
    test_demo.py::Testlogin::test_01[id-01] 参数1
    PASSED
    test_demo.py::Testlogin::test_01[id-02] 参数2
    PASSED
    
    

    相关文章

      网友评论

          本文标题:Python测试框架:pytest之fixture使用浅析

          本文链接:https://www.haomeiwen.com/subject/hzjwaltx.html