之前已经讲过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
使用案例
目录结构如下:
最外层/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):
userName = 'admin'userPassword = '123456'print(f"login:用户admin 执行登录操作")token = '1234v242fsqq'yield userName, tokenprint(f"logout:用户{userName}执行退出登录操作\n")
run.py文件代码,执行入口:```pythonimport pytestif __name__ == '__main__':pytest.main(["-s", "./"])
/Moudle1/Test_Contest_01.py的代码:
import pytestclass Test_Contest_01:def test_case_01(self, loginAndLogout):username, token = loginAndLogoutprint(f"正在执行test_case_01, 账号:{username},token:{token}")def test_case_02(self, loginAndLogout):username, token = loginAndLogoutprint(f"正在执行test_case_02, 账号:{username},token:{token}")if __name__ == '__main__':pytest.main(['Test_Contest_01.py', '-s'])
/Moudle2/Test_Contest_02.py的代码:
import pytestclass Test_Contest_02:def test_case_03(self, loginAndLogout):username, token = loginAndLogoutprint(f"正在执行test_case_03, 账号:{username},token:{token}")def test_case_04(self, loginAndLogout):username, token = loginAndLogoutprint(f"正在执行test_case_04, 账号:{username},token:{token}")if __name__ == '__main__':pytest.main(['Test_Contest_01.py', '-s'])
/Moudle2/conftest.py的代码:
import pytest# 定义的夹具函数, 实现 用例执行前登录,用例执行后登出的效果@pytest.fixture(scope='function')def loginAndLogout(initSeleniumDriver):userName = 'module2专用测试用户'userPassword = '123456'print(f"login:用户{userName} 执行登录操作")token = 'wewe3t242fsrqqwe'yield userName, tokenprint(f"logout:用户{userName}执行退出登录操作\n")
执行结果:
collected 4 itemsMoudle1\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 ==============================
执行上述代码发现:conftest.py可以有多个,但是会以测试代码层级最近的为准
