之前已经讲过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")
run.py文件代码,执行入口:
import pytest
if __name__ == '__main__':
pytest.main(["-s", "./"])
/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'])
/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'])
/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")
执行结果:
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 ==============================
执行上述代码发现:conftest.py可以有多个,但是会以测试代码层级最近的为准