Pytest只能实例化一个类对象来测试其所有方法吗?

时间:2018-11-27 00:04:57

标签: python pytest

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

1 个答案:

答案 0 :(得分:1)

夹具可以具有不同的作用域,换句话说,对于使用它的每个函数,一次调用,对于使用它的每个测试模块,一次调用,或者对于使用它的每个测试会话,一次调用。参见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