• 『德不孤』Pytest框架 — 14、Pytest中的conftest.py文件


    1、conftest.py文件介绍

    conftest.py文件是Pytest框架里面一个很重要的东西,它可以在这个文件里面编写Fixture函数,这个Fixture函数的作用,就相当于Unittest框架里面的setup()前置函数和teardown()后置函数,虽然Pytest框架也有setup()前置函数和teardown()后置函数,但是在实际工作中没必要写在测试用例文件中,直接写在conftests.py里面就好了,Pytest框架会自动去找conftest.py文件里面的东西,这样更灵活。

    总结:在实际工作中,通常conftest.py@pytest.fixture()结合使用,实现全局的前后置应用。

    2、conftest.py的注意事项

    1. conftest.py文件是单独存放的一个夹具(Fixture)配置文件,名称是不能更改。
    2. 可以在不同的.py文件中使用同一个Fixture函数。
    3. 原则上conftest.py需要和运行的用例放到同一目录中,并且有__init__.py文件,那么conftest.py作用于整个目录。
      如果希望Fixture(夹具)共享给所有测试,则可以把conftest.py文件放在测试框架的根目录下。
    4. conftest.py文件中的内容,不需要做任何的imprt导入的操作就能够读取到,因为Pytest用例会自动查找。
    5. 建议把测试项目的所有Fixture都存放在conftest.py文件中,把conftest.py当作Pytest的Fixture仓库。

    3、conftest.py的使用

    (1)测试框架的根目录或者包中创建conftest.py文件

    python
    """
    1.学习目标
        掌握conftest.py文件编写格式
    2.操作步骤
        2.1 conftest.py文件名不能修改
            conftest.py文件中存放项目所有的fixture
            方便对fixture管理和维护
        2.2 在conftest.py定义函数
            在函数前添加@pytest.fixture()装饰器
            在测试用例的函数中传入fixture标识的函数名。
    
    提示:conftest.py文件放在项目的根目录,作用域是全局的。
        conftest.py文件放在某一个包下,作用域只在该包内。
    
    """
    import pytest
    from selenium import webdriver
    
    
    @pytest.fixture()
    def login():
        print("打开APP")
        print("登录成功")
        yield  # 当用例执行完成后,执行yield后的代码
        print("关闭APP")
    
    
    @pytest.fixture()
    def driver(request):  # request是Pytest中的一个关键字,固定写法。
        # 步骤1:创建浏览器驱动对象
        driver = webdriver.Chrome()
    
        # 步骤3:定义用例执行后要执行的代码,封装到一个函数中
        def end():  # 这个end函数命是自定义的
            driver.quit()
    
        # 步骤4:执行上面封装的代码。
        # 通过request关键字,结束上面的函数。
        request.addfinalizer(end)  # 终结函数
    
        # 步骤2:返回浏览器驱动对象,给测试用例
        return driver
    

    (2)测试用例文件如下

    python
    import pytest
    
    # 注意:要把conftest.py文件中定义的fixture方法添加到用例中
    def test_add_cart(login): # 把conftest.py文件中的fixture函数传入用例
        print("添加购物车--需要登录")
    
    
    def test_add_address(login):
        print("添加收货地址--需要登录")
    
    
    if __name__ == '__main__':
        pytest.main()
    
    """
    执行结果:
    
    test_01.py::test_add_cart 打开APP
    登录成功
    添加购物车--需要登录
    PASSED关闭APP
    
    test_01.py::test_add_address 打开APP
    登录成功
    添加收货地址--需要登录
    PASSED关闭APP
    """

    4、不同位置conftest.py文件的优先级

    其作用范围是当前目录包括子目录里的测试模块。

    • 比如在测试框架的根目录创建conftest.py文件,文件中的Fixture的作用范围是所有测试模块。
    • 比如在某个单独的测试文件夹里创建conftest.py文件,文件中Fixture的作用范围,就仅局限于该测试文件夹里的测试模块。
      该测试文件夹外的测试模块,或者该测试文件夹外的测试文件夹,是无法调用到这个conftest.py文件中的Fixture。
    • 如果测试框架的根目录和子包中都有conftest.py文件,并且这两个conftest.py文件中都有一个同名的Fixture,实际生效的是测试框架中子包目录下的conftest.py文件中配置的Fixture。
    • 提示:一个用例可以添加多个conftest.py文件中定义的Fixture夹具,如下:
      python
      # 注意:要把conftest.py文件中定义的fixture方法添加到用例中
      def test_add_cart(login, driver):
          print("添加购物车--需要登录")

    5、conftest.py中Fixture(夹具)的作用域

    Fixture的scope参数也适用conftest.py文件中Fixture的特性:

    1. conftest.py文件中Fixture的scope参数为session,那么所有的测试文件执行前(后)执行一次conftest.py文件中的Fixture。
    2. conftest.py文件中Fixture的scope参数为module,那么每一个测试文件执行前(后)都会执行一次conftest.py文件中Fixture。
    3. conftest.py文件中Fixture的scope参数为class,那么每一个测试文件中的测试类执行前(后)都会执行一次conftest.py文件中Fixture。
    4. conftest.py文件中Fixture的scope参数为function,那么所有文件的测试用例执行前(后)都会执行一次conftest.py文件中Fixture。

    6、总结

    • Pytest框架中的setup()/teardown()函数,setup_class()/teardown_class()函数。他们是作用于所有用例或者所有类的。
    • @pytest.fixtrue()的作用域是既可以部分用例,也可以全部用例的前后置。
    • conftest.py文件和@pytest.fxtrue()装饰器结合使用,作用于全局用例的前后置。

    参考:


    __EOF__

  • 本文作者: 繁华似锦的博客
  • 本文链接: https://www.cnblogs.com/liuyuelinfighting/p/16025998.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    【linux高性能服务器编程】中篇
    Leetcode
    【ElasticSearch】ElasticSearch常用查询api集合(一)
    【C++进阶学习】第二弹——继承(下)——挖掘继承深处的奥秘
    如何去做短视频?
    vue中使用history.replaceState 更改url vue router 无法感知的问题
    研究一下 JSON.parse(JSON.stringify(obj))
    441分2023级东南大学920专业基础综合信号和数字电路考研上岸经验分享信息科学与工程学院
    浅谈消防设备电源监控系统在高层民用建筑内的应用
    2021年下半年信息安全工程师下午真题及答案解析
  • 原文地址:https://www.cnblogs.com/liuyuelinfighting/p/16025998.html