zoukankan      html  css  js  c++  java
  • python pytest全局用例共用之conftest.py详解

    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配置脚本名称是固定的,不能改名称

    5、conftest.py文件不能被其他文件导入

    6、所有同目录测试文件运行前都会执行conftest.py文件

    二、’conftest用法:

    conftest文件实际应用需要结合fixture来使用,fixture中参数scope也适用conftest中fixture的特性,这里再说明一下

    1、fixture源码详解

    fixture(scope='function',params=None,autouse=False,ids=None,name=None):
    fixture里面有个scope参数可以控制fixture的作用范围,scope:有四个级别参数"function"(默认),"class","module","session

    params:一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它。
    autouse:如果True,则为所有测试激活fixture func可以看到它。如果为False则显示需要参考来激活fixture
    ids:每个字符串id的列表,每个字符串对应于params这样他们就是测试ID的一部分。如果没有提供ID它们将从params自动生成
    name:fixture的名称。这默认为装饰函数的名称。如果fixture在定义它的统一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽,解决这个问题的一种方法时将装饰函数命令"fixture_"然后使用"@pytest.fixture(name='')"。

    2、fixture的作用范围

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

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

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

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

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

    function默认模式@pytest.fixture(scope='function')或 @pytest.fixture()

    3、conftest结合fixture的使用

    conftest中fixture的scope参数为session,所有测试.py文件执行前执行一次

    conftest中fixture的scope参数为module,每一个测试.py文件执行前都会执行一次conftest文件中的fixture

    conftest中fixture的scope参数为class,每一个测试文件中的测试类执行前都会执行一次conftest文件中的fixture

    conftest中fixture的scope参数为function,所有文件的测试用例执行前都会执行一次conftest文件中的fixture

    三、conftest应用场景

    1、每个接口需共用到的token

    2、每个接口需共用到的测试用例数据

    3、每个接口需共用到的配置信息

    四、代码实例

    多个.py文件只调用1次fixture
     
    import pytest
    # conftest.py
    @pytest.fixture(scope='session')
    def get_token():
        token = 'qeehfjejwjwjej11sss@22'
        print('获取到token:%s' % token)
        return token
        
    import pytest
    # test02.py
    class Test(object):
        def test2(self,get_token):
            token = 'qeehfjejwjwjej11sss@22'
            print("【执行test02.py-Test类-test2用例,获取get_token:%s】" %get_token)
            assert get_token == token
     
    if __name__=="__main__":
        pytest.main(["-s","test02.py","test03.py"])
     
     
    import pytest
    #test03.py
    class Test(object):
        def test3(self,get_token):
            token = 'qeehfjejwjwjej11sss@22'
            print("【执行test03.py-Test类-test3用例,获取get_token:%s】" %get_token)
            assert get_token == token
        def test4(self,get_token):
            token = 'qeehfjejwjwjej11sss@22'
            print("【执行test03.py-Test类-test4用例,获取get_token:%s】" %get_token)
            assert get_token == token
     
    if __name__=="__main__":
        pytest.main(["-s","test02.py","test03.py"])
     
     
    "C:Program FilesPython35python.exe" C:/Users/wangli/PycharmProjects/Test/test/test02.py
    ============================= test session starts =============================
    platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
    rootdir: C:UserswangliPycharmProjectsTest	est
    collected 3 items
     
    test02.py 获取到token:qeehfjejwjwjej11sss@22
    【执行test02.py-Test类-test2用例,获取get_token:qeehfjejwjwjej11sss@22】
    .
    test03.py 【执行test03.py-Test类-test3用例,获取get_token:qeehfjejwjwjej11sss@22】
    .【执行test03.py-Test类-test4用例,获取get_token:qeehfjejwjwjej11sss@22】
    .
     
    ============================== 3 passed in 0.30s ==============================
     
    
    ————————————————
    
    

    使用多个fixture

    如果用例需要用到多个fixture的返回数据,fixture也可以return一个元组、list或字典,然后从里面取出对应数据。

    # test_fixture4.py
    import pytest
    
    @pytest.fixture()
    def user():
        print("获取用户名")
        a = "yoyo"
        b = "123456"
        return (a, b)
    
    
    def test_1(user):
        u = user[0]
        p = user[1]
        print("测试账号:%s, 密码:%s" % (u, p))
        assert u == "yoyo"
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_fixture4.py"])
    

    当然也可以分开定义成多个fixture,然后test_用例传多个fixture参数

    # test_fixture5.py
    import pytest
    
    @pytest.fixture()
    def user():
        print("获取用户名")
        a = "yoyo"
        return a
    
    @pytest.fixture()
    def psw():
        print("获取密码")
        b = "123456"
        return b
    
    def test_1(user, psw):
        '''传多个fixture'''
        print("测试账号:%s, 密码:%s" % (user, psw))
        assert user == "yoyo"
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_fixture5.py"])
    

    fixture与fixture互相调用

    fixture与fixture直接也能互相调用的

    import pytest
    
    @pytest.fixture()
    def first():
        print("获取用户名")
        a = "yoyo"
        return a
    
    @pytest.fixture()
    def sencond(first):
        '''psw调用user fixture'''
        a = first
        b = "123456"
        return (a, b)
    
    def test_1(sencond):
        '''用例传fixture'''
        print("测试账号:%s, 密码:%s" % (sencond[0], sencond[1]))
    
        assert sencond[0] == "yoyo"
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_fixture6.py"])
    

    ————————————————

    版权声明:本文为CSDN博主「王大力测试进阶之路」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_36502272/article/details/102975467

  • 相关阅读:
    剑指Offer-11.二进制中1的个数(C++/Java)
    剑指Offer-10.矩形覆盖(C++/Java)
    剑指Offer-9.变态跳台阶(C++/Java)
    UVA 1608 Non-boring sequence 不无聊的序列(分治,中途相遇)
    UVA1607 Gates 与非门电路 (二分)
    UVA 1451 Average平均值 (数形结合,斜率优化)
    UVA 1471 Defense Lines 防线 (LIS变形)
    UVA 1606 Amphiphilic Carbon Molecules 两亲性分子 (极角排序或叉积,扫描法)
    UVA 11134 FabledRooks 传说中的车 (问题分解)
    UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)
  • 原文地址:https://www.cnblogs.com/hanfe1/p/14606251.html
Copyright © 2011-2022 走看看