使用 pytest 的 conftest.py 提高测试代码的可重用性和可维护性
pytest 是一个功能强大的 Python 测试框架,它提供了许多灵活且易于扩展的功能。其中之一是使用 conftest.py
文件来共享和管理测试代码的配置和工具函数。本文将介绍 conftest.py
的作用,以及如何使用它来提高测试代码的可重用性和可维护性。
前言
在编写和组织测试代码时,复用性和维护性是两个关键考虑因素。pytest 是一个流行的 Python 测试框架,它提供了一种简洁而灵活的方式来组织和运行测试。其中一个强大的特性是 conftest.py 文件,它允许我们共享和管理测试代码的配置和工具函数。本文将详细介绍 conftest.py 的作用和使用方法,以帮助您提高测试代码的复用性和可维护性。
conftest.py文件
- conftest.py 文件的作用
conftest.py 文件在 pytest 中具有以下作用:
- 共享配置:通过在
conftest.py
中定义全局的配置参数,可以使多个测试模块共享相同的配置设置,避免重复代码。 - 自定义 fixture:
conftest.py
允许我们定义自定义的fixture
,它是一种提供测试数据或测试环境的机制。这些fixture
可以在测试模块中通过函数名直接使用,从而简化测试代码。 - 导入外部插件:通过
conftest.py
,可以导入和配置第三方插件,以增强 pytest 的功能。这样可以灵活地扩展测试框架,满足项目的需求。
- 创建和配置conftest.py文件
创建和组织 conftest.py 文件的步骤如下:
- 创建 conftest.py 文件:在项目的根目录或测试目录下创建一个名为
conftest.py·
的文件。 - 定义共享 fixture:在
conftest.py
中,使用@pytest.fixture
装饰器定义共享的fixture
函数。这些fixture
函数可以在测试模块中直接使用。 - 配置全局参数:在
conftest.py
中,可以定义全局的配置参数,例如日志级别、数据库连接等。这些参数可以在整个测试项目中共享和使用。 - 导入和配置插件:如果需要使用第三方插件,可以在
conftest.py
中导入并进行相应的配置。这样,插件的功能就可以在整个测试项目中生效。
使用示例
我们在根目录或者在包中创建conftest.py
文件,文件内容如下:
import pytest
from selenium import webdriver
@pytest.fixture()
def login():
print("打开网页")
print("登录成功")
yield # 当用例执行完成后,执行yield后的代码
print("关闭网页")
@pytest.fixture()
def driver(request): # request是Pytest中的一个关键字,固定写法。
# 步骤1:创建浏览器驱动对象
driver = webdriver.Chrome()
# 步骤3:定义用例执行后要执行的代码,封装到一个函数中
def end(): # 这个end函数命是自定义的
driver.quit()
# 步骤4:执行上面封装的代码。
# 通过request关键字,结束上面的函数。
request.addfinalizer(end) # 终结函数
# 步骤2:返回浏览器驱动对象,给测试用例
return driver
测试用例文件如下:
import pytest
# 注意:要把conftest.py文件中定义的fixture方法添加到用例中
def test_add_cart(login): # 把conftest.py文件中的fixture函数传入用例
print("添加购物车--需要登录")
def test_add_address(login):
print("添加收货地址--需要登录")
if __name__ == '__main__':
pytest.main()
运行测试用例文件,结果如下:
============================= test session starts =============================
collecting ... collected 2 items
test_demo1.py::test_add_cart 打开网页
登录成功
PASSED [ 50%]添加购物车--需要登录
关闭网页
test_demo1.py::test_add_address 打开网页
登录成功
PASSED [100%]添加收货地址--需要登录
关闭网页
============================== 2 passed in 0.02s ==============================
conftest.py文件的优先级
conftest.py
的作用范围是当前目录包括子目录里的测试模块。如下:
- 在测试框架的根目录创建
conftest.py
文件,文件中的Fixture的作用范围是所有测试模块。 - 在某个单独的测试文件夹里创建
conftest.py
文件,文件中Fixture的作用范围,就仅局限于该测试文件夹里的测试模块。 - 测试文件夹外的测试模块,或者该测试文件夹外的测试文件夹,是无法调用到这个
conftest.py
文件中的Fixture
。 - 测试框架的根目录和子包中都有
conftest.py
文件,并且这两个conftest.py
文件中都有一个同名的Fixture
,实际生效的是测试框架中子包目录
下的conftest.py
文件中配置的Fixture
。
conftest.py中Fixture(夹具)的作用域
Fixture的scope参数也适用conftest.py
文件中Fixture的特性:
conftest.py
文件中Fixture的scope参数为session
,那么所有的测试文件执行前(后)执行一次conftest.py文件中的Fixture。conftest.py
文件中Fixture的scope参数为module
,那么每一个测试文件执行前(后)都会执行一次conftest.py文件中Fixture。conftest.py
文件中Fixture的scope参数为class
,那么每一个测试文件中的测试类执行前(后)都会执行一次conftest.py文件中Fixture。conftest.py
文件中Fixture的scope参数为function
,那么所有文件的测试用例执行前(后)都会执行一次conftest.py文件中Fixture。
总结
conftest.py 文件是 pytest 的一个强大功能,可以帮助我们提高测试代码的可重用性和可维护性。通过共享配置、定义 fixture 和配置全局参数,我们可以减少重复代码,提供统一的测试环境和数据,以及灵活扩展 pytest 的功能。合理使用 conftest.py,将使测试代码更加模块化、清晰和易于维护,从而提高整个测试项目的质量和效率。