【问题标题】:How to avoid stateful dependency in pytest fixtures?如何避免 pytest 设备中的状态依赖?
【发布时间】:2021-03-05 08:47:00
【问题描述】:

我正在测试一个数据库,其中必须一个接一个地调用该数据库类中的方法,以便下一个正在测试的方法对数据进行操作。

@pytest.fixture(scope="module")
def database():
    return database.Database()

# Expected results
result_1 = read_result(1)
result_2 = read_result(2)
result_3 = read_result(3)

def test_a(database):
    database.a() # modifies database fixture
    assert database.a.result == result_1
    
def test_b(database):
    database.b() # requires database fixture to have been modified by a()
    assert database.b.result == result_2
    
def test_c(database):
    database.c() # requires database fixture to have been modified by a() and b()
    assert database.c.result == result_3

这使用了一个模块范围的 pytest 固定装置,因此它被每个测试重用。上面的这个测试会起作用,但这只是因为它按顺序运行测试。据我所知,这是有状态的依赖,我的测试不是孤立的,这在测试中是不好的做法。

有什么更好的方法?

【问题讨论】:

    标签: python pytest python-unittest


    【解决方案1】:

    我在这里看到了几个选项:

    • 进行单个测试而不是三个测试
    • 使用pytest-ordering 定义运行顺序
    • 在 DB 中为每个测试用例预创建实体并在每次运行时重复使用它们

    【讨论】:

    • 将其作为单一测试不允许单独测试abc。订购并不能解决我对依赖性的担忧。至于您的最后一个建议,您的意思是说有 3 个不同的数据库夹具,每个中间测试步骤一个?
    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多