前言
我们知道在python中要想实现数据的共享,可以定义一个“全局变量”,在另一个文件中使用的时候通过先导入,再使用的方式来访问。pytest中定义个conftest.py
来实现数据,参数,方法、函数的共享。本文就给大家介绍一下conftest.py
的用法。
conftest.py
conftest.py
文件是pytest的一个特殊文件,它用于定义项目中的共享fixture
、钩子函数(hook functions)、插件和配置。这个文件可以位于测试目录树的任何级别,pytest会自动识别并应用其中定义的内容。
conftest.py
的功能
- 设置项目和fixture
- 导入外部插件
- 指定钩子函数
conftest.py
特点
conftest.py
可以跨.py文件调用,有多个.py
文件调用时,可让conftest.py
只调用一次fixture
,或调用多次fixture
conftest.py
与运行的用例要在同一个pakage
下,并且有init.py
文件- 不需要import导入
conftest.py
,pytest用例会自动识别该文件,放到项目的根目录下就可以全局目录调用了,如果放到某个package下,那就在该package内有效,可有多个conftest.py
conftest.py
配置脚本名称是固定的,不能改名称conftest.py
文件不能被其他文件导入- 所有同目录测试文件运行前都会执行
conftest.py
文件
conftest.py
使用场景
fixture
适用于在同一个py
文件中多个用例执行时的使用;而conftest.py
方式适用于多个py
文件之间的数据共享。比如常见的有以下场景:
- 请求接口需要共享登录接口的
token/session
- 多个case共享一套测试数据
- 多个case共享配置信息
使用示例
conftest.py
内容如下:
# conftest.py
import pytest
@pytest.fixture(scope='session')
def get_token():
token = 'hogwartssdet'
print('conftest中輸出token:%s' % token)
return token
test_demo01.py
内容如下:
# test_01.py
import pytest
class Test(object):
def test01(self, get_token):
token = 'hogwartssdet'
print("【执行test01.py-Test类-test01用例,获取get_token:%s】" % get_token)
assert get_token == token
if __name__ == "__main__":
pytest.main(["-s", "test_01.py", "test_02.py"])
test_demo02.py
内容如下:
# test_02.py
import pytest
class Test(object):
def test02(self, get_token):
token = 'hogwartssdet'
print("【执行test02.py-Test类-test02用例,获取get_token:%s】" % get_token)
assert get_token == token
def test03(self, get_token):
token = 'hogwartssdet'
print("【执行test02.py-Test类-test03用例,获取get_token:%s】" % get_token)
assert get_token == token
目录结构如下所示:
当conftest.py
中的fixture(scope=session)
时,所有的测试.py
文件执行前执行一次。如下所示:
【执行test01.py-Test类-test01用例,获取get_token:hogwartssdet】
PASSED
test_demo02.py::Test::test02 【执行test02.py-Test类-test02用例,获取get_token:hogwartssdet】
PASSED
test_demo02.py::Test::test03 【执行test02.py-Test类-test03用例,获取get_token:hogwartssdet】
PASSED
当conftest.py
中的fixture(scope=module)
时,每一个测试.py
文件执行前都会执行一次conftest
文件中的fixture
。如下所示:
test_demo01.py::Test::test01 conftest中輸出token:hogwartssdet
【执行test01.py-Test类-test01用例,获取get_token:hogwartssdet】
PASSED
test_demo02.py::Test::test02 conftest中輸出token:hogwartssdet
【执行test02.py-Test类-test02用例,获取get_token:hogwartssdet】
PASSED
test_demo02.py::Test::test03 【执行test02.py-Test类-test03用例,获取get_token:hogwartssdet】
PASSED
当conftest.py
中的fixture(scope=class)
时,每一个测试文件中的测试类执行前都会执行一次conftest
文件中的fixture
。如下所示:
test_demo01.py::Test::test01 conftest中輸出token:hogwartssdet
【执行test01.py-Test类-test01用例,获取get_token:hogwartssdet】
PASSED
test_demo02.py::Test::test02 conftest中輸出token:hogwartssdet
【执行test02.py-Test类-test02用例,获取get_token:hogwartssdet】
PASSED
test_demo02.py::Test::test03 【执行test02.py-Test类-test03用例,获取get_token:hogwartssdet】
PASSED
当conftest.py
中的fixture(scope=function)
时,所有文件的测试用例执行前都会执行一次conftest
文件中的fixture
,如下所示:
test_demo01.py::Test::test01 conftest中輸出token:hogwartssdet
【执行test01.py-Test类-test01用例,获取get_token:hogwartssdet】
PASSED
test_demo02.py::Test::test02 conftest中輸出token:hogwartssdet
【执行test02.py-Test类-test02用例,获取get_token:hogwartssdet】
PASSED
test_demo02.py::Test::test03 conftest中輸出token:hogwartssdet
【执行test02.py-Test类-test03用例,获取get_token:hogwartssdet】
PASSED
总结
conftest.py
文件是pytest中强大而灵活的工具,能够帮助我们更好地管理和组织测试代码。通过合理利用conftest.py
文件,可以实现全局fixture的管理、定制pytest行为以及共享代码资源。这将使我们的测试项目更具可维护性和可扩展性,为开发工作提供更多便利。希望本文可以帮到大家!