• pytest系列教程——7、将fixture写入conftest.py


    之前已经讲过fixture的用法参考之前文档 ,conftest.py文件则是一个专门用来管理夹具函数的文件。

    使用目的

    在测试中,我们需要对所有用例做前置处理的时候。就需要把这部分的初始化步骤抽出来,方便统一管理。比如,我们在UI测试的时候,都需要先初始化Selenium Driver。再比如,我们的测试脚本都需要先登录进去后再进行业务操作。那就完全可以使用conftest.py,完成对前置步骤的抽离。
    conftest.py 的目的就是为了单独管理一些全局的 fixture

    注意要点

    • conftest.py的命名是固定的,不能改
    • conftest.py 不需要导入,脚本运行时候会自动识别
    • conftest.py文件可以写多个fixture
    • conftest.py 只对同一个 package 下的所有测试用例生效
    • 不同目录可以有自己的 conftest.py,一个项目中可以有多个 conftest.py

    使用案例

    目录结构如下:
    在这里插入图片描述

    最外层/MyPytest/conftest.py的配置如下:

    import pytest
    
    
    @pytest.fixture(scope='class')
    def initSeleniumDriver():
        print("初始化SeleniumDriver成功")
        print("已经打开Chrome浏览器")
        yield
        print("关闭浏览器")
    
    
    @pytest.fixture(scope='function')
    def loginAndLogout(initSeleniumDriver):
    
        userName = 'admin'
        userPassword = '123456'
        print(f"login:用户admin 执行登录操作")
        token = '1234v242fsqq'
    
        yield userName, token
    
        print(f"logout:用户{userName}执行退出登录操作\n")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    run.py文件代码,执行入口:

    import pytest
    
    if __name__ == '__main__':
        pytest.main(["-s", "./"])
    
    • 1
    • 2
    • 3
    • 4

    /Moudle1/Test_Contest_01.py的代码:

    import pytest
    
    
    class Test_Contest_01:
        def test_case_01(self, loginAndLogout):
            username, token = loginAndLogout
            print(f"正在执行test_case_01, 账号:{username},token:{token}")
    
        def test_case_02(self, loginAndLogout):
            username, token = loginAndLogout
            print(f"正在执行test_case_02, 账号:{username},token:{token}")
    
    
    if __name__ == '__main__':
        pytest.main(['Test_Contest_01.py', '-s'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    /Moudle2/Test_Contest_02.py的代码:

    import pytest
    
    
    class Test_Contest_02:
        def test_case_03(self, loginAndLogout):
            username, token = loginAndLogout
            print(f"正在执行test_case_03, 账号:{username},token:{token}")
    
        def test_case_04(self, loginAndLogout):
            username, token = loginAndLogout
            print(f"正在执行test_case_04, 账号:{username},token:{token}")
    
    
    if __name__ == '__main__':
        pytest.main(['Test_Contest_01.py', '-s'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    /Moudle2/conftest.py的代码:

    import pytest
    
    
    # 定义的夹具函数, 实现 用例执行前登录,用例执行后登出的效果
    @pytest.fixture(scope='function')
    def loginAndLogout(initSeleniumDriver):
        userName = 'module2专用测试用户'
        userPassword = '123456'
        print(f"login:用户{userName} 执行登录操作")
        token = 'wewe3t242fsrqqwe'
    
        yield userName, token
    
        print(f"logout:用户{userName}执行退出登录操作\n")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    执行结果:

    collected 4 items                                                              
    
    Moudle1\Test_Contest_01.py 初始化SeleniumDriver成功
    已经打开Chrome浏览器
    login:用户admin 执行登录操作
    正在执行test_case_01, 账号:admin,token:1234v242fsqq
    .logout:用户admin执行退出登录操作
    
    login:用户admin 执行登录操作
    正在执行test_case_02, 账号:admin,token:1234v242fsqq
    .logout:用户admin执行退出登录操作
    
    关闭浏览器
    
    Moudle2\Test_Contest_02.py 初始化SeleniumDriver成功
    已经打开Chrome浏览器
    login:用户module2专用测试用户 执行登录操作
    正在执行test_case_03, 账号:module2专用测试用户,token:wewe3t242fsrqqwe
    .logout:用户module2专用测试用户执行退出登录操作
    
    login:用户module2专用测试用户 执行登录操作
    正在执行test_case_04, 账号:module2专用测试用户,token:wewe3t242fsrqqwe
    .logout:用户module2专用测试用户执行退出登录操作
    
    关闭浏览器
    
    
    ============================== 4 passed in 0.09s ==============================
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    执行上述代码发现:conftest.py可以有多个,但是会以测试代码层级最近的为准

  • 相关阅读:
    C. 连锁商店 (暴力优化)
    18.(arcgis api for js篇)arcgis api for js点采集(SketchViewModel)
    Mysql 自带分页异常
    基于SpringBoot的知识管理系统
    Python3 笔记:字符串的 isspace()、istitle()、isdecimal()
    mysql用户管理(sql语句)
    JavaScript概述
    Hive 函数的使用
    Flutter学习三-Flutter基本结构和原理
    Redis常见命令
  • 原文地址:https://blog.csdn.net/bo_mask/article/details/125421002