在Pytest中测试具有许多fixtueres / scenario的单个单元测试用例

时间:2017-07-11 19:46:35

标签: python unit-testing pytest fixtures

我有一个代表某种复杂状态的类。那状态可以改变,我有另一个代表“真实”状态的类的实例。我写了一个函数来做一些差异逻辑,并弄清楚如何将当前状态变为真状态,如果它们不同。

我想使用pytest测试该功能。有许多场景可能性,但测试逻辑非常简单,归结为(伪python代码):

def test_diffing(current_state, prescribed_state):
    properties_to_add = []
    properties_to_delete = []
    properties_to_modify = []
    properties_to_add, properties_to_delete, properties_to_modify = diff_logic(current_state, prescribed_state)

    assert properties_to_add == 1
    assert properties_to_delete == 0
    assert properties_to_modify == 3

断言右侧的数字取决于current_state的内容。我有很多current_state个场景。

如上所述编写单个单元测试的最佳方法是什么,有多对固定装置,以便current_state与断言的预期值一起传递?

我已经看过pytest fixtures参数化,但是这种方法的问题在于它使用装饰器并且很快变得很丑陋,特别是对于大量的参数和大量的测试用例。看来这不是我应该使用灯具的。

实现我干净利落的最佳方式是什么?

*我说它变得很难看,因为对装饰器有15或20组参数非常混乱,并且在装饰器本身中放了很多逻辑。

1 个答案:

答案 0 :(得分:1)

我认为你可以使用on_conflict_do_update来获得你想要的东西。

如下:

</span>Thomas is currently developing a enterprise resource management course for Pluralsight </p>

我使用“束”夹具构造将输入和输出连接在一起。然后测试看起来很干净:

@pytest.fixture(params=[
    {
        'current_state': 'foo',
        'expected': {
            'properties_to_add': 1,
            'properties_to_delete': 2,
            'properties_to_modify': 3,
        },
    },
    ... as many scenarios as you'd like ...
])
def bundle(request):
    return request.param

@pytest.fixture
def current_state(bundle):
    return bundle['current_state']

@pytest.fixture
def expected(bundle):
    return bundle['expected']

然后,如果“params”数据结构(对于“bundle”fixture)变得非常大,你可以在其他地方定义它并格式化代码以便于阅读,从数据文件中加载它等等。