前言
我们知道在 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
文件之间的数据共享。比如常见的有以下场景:
使用示例
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 行为以及共享代码资源。这将使我们的测试项目更具可维护性和可扩展性,为开发工作提供更多便利。希望本文可以帮到大家!
评论