首页 > 解决方案 > Pytest 可以只实例化一个类对象来测试它的所有方法吗?

问题描述

我认为这应该是一个非常常见的场景,例如,如果你有一个类和一些方法。如果您想为它们编写单元测试,例如 test_method_1、test_method_2、... test_method_n,我不想为这些测试函数中的每一个实例化类对象,这可能是多余的或效率低下的。但是,我阅读了 Pytest 的文档,在我看来,例如使用夹具装饰,虽然它似乎只编写了一次类实例化,但实际上每次传递给新的测试函数时都会调用这个实例化。有没有办法不这样做,而是我只创建一次类对象,所有测试都在这个对象内完成?

标签: pythonpytest

解决方案


Fixtures 可以有不同的作用域,或者换句话说,每个使用它的函数调用一次,或者使用它的每个测试模块调用一次,或者使用它的每个测试会话调用一次。请参阅https://docs.pytest.org/en/latest/fixture.html#scope-sharing-a-fixture-instance-across-tests-in-a-class-module-or-session

如果您使用默认范围(函数),此示例脚本将失败,如果您使用其他范围,则通过。

import pytest

SCOPE="function"
#SCOPE="session"

class Shared(object):

    counter = 0

    def __init__(self):
        self.instance_id = Shared.counter
        Shared.counter += 1


@pytest.fixture(scope=SCOPE)
def shared_instance():
    instance = Shared()

    yield instance


def test_one(shared_instance):
    assert shared_instance.instance_id == 0
def test_two(shared_instance):
    assert shared_instance.instance_id == 0

推荐阅读