在异步或多线程代码中测试回调的执行

时间:2018-03-11 17:23:46

标签: python pytest

我需要检查某些操作是否以线程/异步代码中的特定顺序发生。有点像:

def test_threaded_stuff():
    # I can define the callbacks to the operation
    op = start_operation(callback1, callback2, cbargs...)
    op.checkpoint1.wait()
    # check that callback1 and callback2 have been invoked,
    # in that order
    op.checkpoint2.wait()
    # check that they have been invoked again, in reverse order

我可以提供将由操作调用的测试回调,但我不能在其中放置py.test断言,因为我需要测试其执行的整体顺序,而不是任何单个回调的状态。此外,一些回调是在不受py.test控制的单独线程中执行的。

为了测试这样的代码,我提出了以下模式:

def callback1(log):
    log(1)

def callback2(log):
    log(2)

def test_threaded_stuff():
    events = []
    op = start_operation(cb1, cb2, events.append)
    op.checkpoint1.wait()
    assert events == [1, 2]
    op.checkpoint2.wait()
    assert events == [1, 2, 2, 1]

py.test中是否有一种惯用的表达方式?例如,一个可自动记录其调用的可调用夹具,以便我可以在测试中查询调用。

如果需要具体示例,this file就是一个例子,同一目录中的其他文件也是如此。

1 个答案:

答案 0 :(得分:1)

我认为pytest可能没有必要具有特定的功能,标准的Python unittest模块就足够了。

您可以使用跟踪对自己的调用的Mock对象以及方法和属性reference

您可以通过构建您期望并希望测试的assert_has_calls()列表,将其与calls结合使用。它还允许通过any_order=False参数默认测试调用的特定顺序。

因此,通过充分修补模块并在测试中传递Mock对象而不是回调,您将主要能够创建测试。