繁体   English   中英

Python 用于复杂多处理和多线程模糊测试的测试工具

[英]Python testing tool for complex multiprocessing & multithreading fuzzy testing

的背景:

我的团队需要测试一个分布式协议实现(例如:RAFT算法),该实现是基于一个rpc层(例如:grpc),我们已经基于multiprocessing库提供的utils实现了一个mocked rpc层,我们可以执行重新排序、丢弃、延迟等操作来模拟真实的网络环境。 mock库用于注入模拟函数。 我们在分布式协议中生成子进程作为代理。

目前的测试工具:

我们使用 pytest 作为我们的主要框架,pytest 非常适合单线程测试,但不适合这种情况,因为在测试的 ZC1C425268E68385D1ABZ504F 生成的线程/进程中无法捕获异常。 我们尝试创建可以捕获异常并将异常发送回并重新引发的运行器:

result = [None, None, None]
    finished = [False, False, False]
    while not all(finished):
        for p, pi, i in zip(procs, proc_pipes, [0, 1, 2]):
            if pi.poll(timeout=1e-3):
                status, r = pi.recv()
                if status:
                    finished[i] = True
                    result[i] = r
                else:
                    raise r
    return result

但是这种方法仅能捕获测试过程中创建的代理进程抛出的异常(例如:使用pytest.fixture创建的),并且不能监控算法中产生的后台线程中抛出的异常。

一些要求:

如果有除pytest之外专门用于测试分布式程序的工具,那将是最好的。

如果不存在这样的工具,那么我们希望找到一个 pytest 插件,它可以监视在测试执行期间产生的线程和进程,最好带有过滤器 function 以忽略一些异常。

如果这不可能,那么如果在任何线程/进程中抛出任何异常,它应该立即终止测试,我们将使用其他日志记录工具来捕获执行过程。

感谢您的慷慨帮助!

也许pytest-reraise可以在这里帮助你? 它提供了一个上下文管理器夹具来捕获来自其他线程的异常,并在捕获到异常时使测试用例失败。 这是一个最小的示例测试用例,它会失败并提供有关断言错误的详细信息:

from threading import Thread

def test_assert(reraise):

    def run():
        with reraise:
            assert False

    Thread(target=run).start()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM