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