使用 pytest 的 conftest.py 提高测试代码的可重用性和可维护性

conftest.py是什么?该怎么用?_用例

pytest 是一个功能强大的 Python 测试框架,它提供了许多灵活且易于扩展的功能。其中之一是使用 conftest.py 文件来共享和管理测试代码的配置和工具函数。本文将介绍 conftest.py 的作用,以及如何使用它来提高测试代码的可重用性和可维护性。


前言

在编写和组织测试代码时,复用性和维护性是两个关键考虑因素。pytest 是一个流行的 Python 测试框架,它提供了一种简洁而灵活的方式来组织和运行测试。其中一个强大的特性是 conftest.py 文件,它允许我们共享和管理测试代码的配置和工具函数。本文将详细介绍 conftest.py 的作用和使用方法,以帮助您提高测试代码的复用性和可维护性。

conftest.py文件

  1. conftest.py 文件的作用

conftest.py 文件在 pytest 中具有以下作用:

  • 共享配置:通过在 conftest.py 中定义全局的配置参数,可以使多个测试模块共享相同的配置设置,避免重复代码。
  • 自定义 fixture:conftest.py 允许我们定义自定义的 fixture,它是一种提供测试数据或测试环境的机制。这些 fixture 可以在测试模块中通过函数名直接使用,从而简化测试代码。
  • 导入外部插件:通过 conftest.py,可以导入和配置第三方插件,以增强 pytest 的功能。这样可以灵活地扩展测试框架,满足项目的需求。
  1. 创建和配置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,将使测试代码更加模块化、清晰和易于维护,从而提高整个测试项目的质量和效率。