Python 如何使用pytest测试基于服务器输出的客户机-服务器交互?

Python 如何使用pytest测试基于服务器输出的客户机-服务器交互?,python,multithreading,subprocess,pytest,Python,Multithreading,Subprocess,Pytest,我想实现以下场景: [线程1]在单独的Python线程2中通过子进程运行服务器 [线程2]锁定,直到服务器输出中出现特定行 [线程1]尝试获取锁并等待它被线程2释放 一些相关代码: self._proc = subprocess.Popen([self._bin] + self._args, shell=False, bufsize=1, stdout=subprocess.PIPE, stderr=subprocess.PIPE) while self._proc.poll() is None

我想实现以下场景:

  • [线程1]在单独的Python线程2中通过
    子进程运行服务器
  • [线程2]锁定,直到服务器输出中出现特定行
  • [线程1]尝试获取锁并等待它被线程2释放
  • 一些相关代码:

    self._proc = subprocess.Popen([self._bin] + self._args, shell=False, bufsize=1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    while self._proc.poll() is None:
        line = self._proc.stderr.readline()
        if 'Ready for connections' in line:
            break
    self._lock.release()
    
    但问题是,它在pytest中不起作用。 如果我使用
    -s
    参数运行测试,那么它可以工作。否则,在获取另一个线程中的锁时,它将永远挂起

    我还尝试将fixture
    用于capsys.disabled()
    用于capfd.disabled()
    ,但没有成功


    是否有一种简单的方法可以仅禁用子流程输出的捕获?或者它应该开箱即用,也许我的代码中还有其他一些缺陷?

    这个插件可以在这里使用。它提供了一个简单的fixture
    xprocess
    ,可用于在单独的进程中启动服务器实例,并使其在测试中可用。它还将创建一个过程
    日志文件
    ,您可以使用该文件在测试期间监控过程输出。

    我无法重现您描述的行为;事实上,我经常使用捕获
    subprocess.Popen
    输出的方法(尽管通常是通过iter中的
    行(proc.stdout.readline,”):如果不是行:中断
    snippet)。你能给我一个机会吗?