• pytest特殊的配置文件-conftest.py


    什么是conftest

    在Python的pytest测试框架中,conftest.py文件是一个特殊的配置文件,用于定义fixture和插件级别的功能。这个文件的名字是固定的,即conftest.py,并且它可以放在项目的任何目录中。pytest会自动发现并加载这个文件中的fixture和插件。

    conftest.py文件的主要作用有以下几点:

    1. 定义Fixture:你可以在conftest.py文件中定义fixture,这样它们就可以在整个项目中的任意测试函数或测试用例中被复用。由于pytest会自动加载conftest.py中的fixture,因此你无需在每个测试文件中显式地导入和使用它们。

    2. 修改pytest行为:通过实现pytest的钩子函数(hook functions),你可以修改pytest的默认行为。例如,你可以定义一个钩子函数来在测试开始前或结束后执行某些操作,如打印日志、设置环境变量等。

    3. 插件配置:如果你使用了pytest的插件,你可以在conftest.py文件中进行配置。这可以包括设置插件的参数、注册自定义的命令行选项等。

    4. 共享设置conftest.py文件允许你在多个测试文件和目录之间共享设置代码。这对于管理大型项目的测试环境非常有用,可以避免代码重复和维护困难。

    5. 作用域管理:通过指定fixture的作用域(scope),你可以控制它们在何时被创建和销毁。这在处理资源密集型或需要长时间初始化的设置时非常有用。

    6. 目录结构灵活conftest.py文件可以放在项目的任何位置,这使得你可以根据项目的目录结构灵活地组织测试代码和配置。pytest会自动加载所有找到的conftest.py文件。

    总之,conftest.py文件是pytest中一个强大的工具,它允许你以灵活和可维护的方式定义和共享测试环境的设置和配置。
    当然,以下是一个简单的conftest.py文件的使用例子。这个例子中,我们将创建一个名为database的fixture,用于模拟数据库连接的设置和清理。

    conftest举例

    首先,我们创建一个conftest.py文件,并在其中定义database fixture:

    # conftest.py
    import pytest
    
    # 假设这是一个连接到数据库的函数
    def connect_to_database():
        print("Connecting to the database...")
        # 这里可以是实际的数据库连接代码
        return "database_connection"
    
    # 假设这是一个关闭数据库连接的函数
    def close_database_connection(conn):
        print("Closing the database connection...")
        # 这里可以是实际的关闭数据库连接代码
    
    # 定义一个名为database的fixture
    @pytest.fixture(scope="session")
    def database():
        # 在测试会话开始时建立数据库连接
        conn = connect_to_database()
        
        # 使用yield来定义fixture的设置和清理部分
        yield conn
        
        # 在测试会话结束时关闭数据库连接
        close_database_connection(conn)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    接下来,我们创建一个测试文件test_example.py,并使用database fixture:

    # test_example.py
    def test_database_operations(database):
        # 在这个测试函数中,我们直接使用database fixture
        # 它会被pytest自动传递进来
        assert database == "database_connection"
        # 在这里可以执行一些需要数据库连接的测试操作
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这个例子中,database fixture的作用域被设置为session,这意味着它只会在整个测试会话开始时执行一次设置,并在会话结束时执行一次清理。这对于资源密集型的操作(如数据库连接)非常有用,因为它可以避免在每个测试函数中重复进行这些操作。

    要运行这些测试,你需要在包含conftest.pytest_example.py的目录中运行pytest:

    pytest
    
    • 1

    pytest会自动加载conftest.py中的fixture,并将其注入到需要它们的测试函数中。在这个例子中,test_database_operations函数将接收到database fixture作为参数,从而可以访问模拟的数据库连接。

    修改pytest的默认行为

    当使用conftest.py来实现pytest的钩子函数时,你可以修改pytest的默认行为,以执行自定义的操作。以下是一个例子,演示了如何使用钩子函数来修改测试报告的输出格式。

    首先,我们需要在conftest.py文件中定义一个钩子函数。在这个例子中,我们将使用pytest_configurepytest_terminal_summary钩子函数来修改测试报告的输出。

    # conftest.py
    
    def pytest_configure(config):
        # 这个钩子函数在pytest开始运行时被调用
        # 可以在这里进行一些初始化操作
        print("\n开始测试...")
    
    def pytest_terminal_summary(terminalreporter):
        # 这个钩子函数在pytest运行结束时被调用
        # 可以用来定制终端报告的输出
        if terminalreporter.stats['failed']:
            print("\n测试失败!")
        else:
            print("\n测试通过!")
    
        # 还可以添加其他自定义输出或逻辑
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    接下来,我们创建一个测试文件test_sample.py,包含一些简单的测试用例:

    # test_sample.py
    
    def test_addition():
        assert 1 + 1 == 2
    
    def test_subtraction():
        assert 2 - 1 == 1
    
    def test_failure():
        assert 0 == 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    现在,运行pytest来执行测试:

    pytest
    
    • 1

    当你运行pytest时,你会看到pytest_configure钩子函数输出的“开始测试…”信息。测试完成后,pytest_terminal_summary钩子函数会根据测试结果输出“测试通过!”或“测试失败!”的消息。

    这个例子展示了如何使用conftest.py中的钩子函数来修改pytest的默认行为。你可以根据需要定义不同的钩子函数来实现各种自定义的功能,比如修改测试报告的格式、添加日志记录、改变测试用例的执行顺序等。

    要查看所有可用的钩子函数,你可以查阅pytest的官方文档中关于钩子函数的部分,它列出了所有可用的钩子函数及其用途。

  • 相关阅读:
    探索dbus-sensors: 从传感器读取到xyz.openbmc_project.Sensor接口的细致解析
    764. 最大加号标志
    一文讲透机器学习超参数调优!
    NVMe SSD 学习总结 03: 浅析SSD技术基础NAND-Flash原理(NANA结构、工作原理、写放大)
    10-Django项目--Ajax请求
    java基础巩固
    专注区块链底层技术突破,“复杂美”用技术开源推动产业未来
    视频编码原理补(H264)
    P1030 [NOIP2001 普及组] 求先序排列
    排序算法的分析及实现
  • 原文地址:https://blog.csdn.net/seanyang_/article/details/136264167