zoukankan      html  css  js  c++  java
  • 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配置脚本名称是固定的,不能改名称

    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_<fixturename>"然后使用"@pytest.fixture(name='<fixturename>')"。

    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 ==============================
     
    Process finished with exit code 0
    #多个.py文件只调用多次fixture
     
    import pytest
    # conftest.py
    @pytest.fixture()
    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/test03.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 获取到token:qeehfjejwjwjej11sss@22
    【执行test03.py-Test类-test3用例,获取get_token:qeehfjejwjwjej11sss@22】
    .获取到token:qeehfjejwjwjej11sss@22
    【执行test03.py-Test类-test4用例,获取get_token:qeehfjejwjwjej11sss@22】
    .
     
    ============================== 3 passed in 0.04s ==============================
     
    Process finished with exit code 0


    参考原文链接:https://blog.csdn.net/qq_36502272/article/details/102975467

    报错问题:

    如果方法名称没有写正确在.py文件里就不会调用到conftest.py的方法

  • 相关阅读:
    Docker容器启动时初始化Mysql数据库
    使用Buildpacks高效构建Docker镜像
    Mybatis 强大的结果集映射器resultMap
    Java 集合排序策略接口 Comparator
    Spring MVC 函数式编程进阶
    换一种方式编写 Spring MVC 接口
    【asp.net core 系列】6 实战之 一个项目的完整结构
    【asp.net core 系列】5 布局页和静态资源
    【asp.net core 系列】4. 更高更强的路由
    【Java Spring Cloud 实战之路】- 使用Nacos和网关中心的创建
  • 原文地址:https://www.cnblogs.com/zhaocbbb/p/12543447.html
Copyright © 2011-2022 走看看