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

标签 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是一个示例,同一目录中的其他文件也是如此。

最佳答案

我认为 pytest 可能不需要具有特定的功能,标准的 Python 单元测试模块就足够了。

您可以利用 Mock 对象来跟踪对自身以及方法和属性的调用,reference

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

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

关于python - 测试异步或多线程代码中回调的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49222910/

相关文章:

python - pytest-monkeypatch 装饰器(不使用模拟/补丁)

python - 如何从异步 pytest 函数测试异步单击命令?

python - 在 python 的 while 循环中更改标志值的可能方法?

区分大小写的 Python 字符串模板

python - 将元组从嵌套列表分离到单独的列表中

django - Pytest 和覆盖率 : why do coverage results vary with directory structure?

python - 如何断言列表中确实包含预期的元素?

python - py.test 断言可能会引发,如果引发它将是 __

python - Mac 上使用 python 3.4 的虚拟环境

python - 将 APIView 添加到 Django REST Framework 可浏览 API