之前已经讲过fixture的用法参考4、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

    使用案例

    目录结构如下:
    image.png
    最外层/MyPytest/conftest.py的配置如下: ```python import pytest

@pytest.fixture(scope=’class’) def initSeleniumDriver(): print(“初始化SeleniumDriver成功”) print(“已经打开Chrome浏览器”) yield print(“关闭浏览器”)

@pytest.fixture(scope=’function’) def loginAndLogout(initSeleniumDriver):

  1. userName = 'admin'
  2. userPassword = '123456'
  3. print(f"login:用户admin 执行登录操作")
  4. token = '1234v242fsqq'
  5. yield userName, token
  6. print(f"logout:用户{userName}执行退出登录操作\n")
  1. run.py文件代码,执行入口:
  2. ```python
  3. import pytest
  4. if __name__ == '__main__':
  5. pytest.main(["-s", "./"])

/Moudle1/Test_Contest_01.py的代码:

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

/Moudle2/Test_Contest_02.py的代码:

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

/Moudle2/conftest.py的代码:

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

执行结果:

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

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