写点什么

软件测试 / 测试开发全日制|Pytest conftest.py 配置文件如何使用?

  • 2024-01-12
    北京
  • 本文字数:2123 字

    阅读完需:约 7 分钟

前言

我们知道在 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.pyimport 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.pyimport 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】PASSEDtest_demo02.py::Test::test02 【执行test02.py-Test类-test02用例,获取get_token:hogwartssdet】PASSEDtest_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】PASSEDtest_demo02.py::Test::test02 conftest中輸出token:hogwartssdet【执行test02.py-Test类-test02用例,获取get_token:hogwartssdet】PASSEDtest_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】PASSEDtest_demo02.py::Test::test02 conftest中輸出token:hogwartssdet【执行test02.py-Test类-test02用例,获取get_token:hogwartssdet】PASSEDtest_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】PASSEDtest_demo02.py::Test::test02 conftest中輸出token:hogwartssdet【执行test02.py-Test类-test02用例,获取get_token:hogwartssdet】PASSEDtest_demo02.py::Test::test03 conftest中輸出token:hogwartssdet【执行test02.py-Test类-test03用例,获取get_token:hogwartssdet】PASSED
复制代码

总结

conftest.py文件是 pytest 中强大而灵活的工具,能够帮助我们更好地管理和组织测试代码。通过合理利用conftest.py文件,可以实现全局 fixture 的管理、定制 pytest 行为以及共享代码资源。这将使我们的测试项目更具可维护性和可扩展性,为开发工作提供更多便利。希望本文可以帮到大家!



用户头像

社区:ceshiren.com 微信:ceshiren2021 2019-10-23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
软件测试/测试开发全日制|Pytest conftest.py配置文件如何使用?_霍格沃兹测试开发学社_InfoQ写作社区