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

时间:2019-05-28 16:53:28

标签: python multithreading subprocess pytest

我要实现以下情况:

  1. [线程1]通过subprocess在单独的Python线程#2中运行服务器。
  2. [线程2]锁定,直到服务器输出中出现特定行。
  3. [线程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参数运行测试,那么它将起作用。否则,它将永久挂在另一个线程的锁上。

我也尝试使用治具with capsys.disabled()with capfd.disabled(),但没有成功。

是否有一种简单的方法仅禁用捕获子过程输出?还是应该立即使用,也许我在代码中还有其他缺陷?

1 个答案:

答案 0 :(得分:0)

此处可以使用插件pytest-xprocess。它提供了一个简单的夹具xprocess,可用于在单独的过程中启动服务器实例并使其在测试中可用。它还将创建流程logfile,可用于在测试过程中监视流程输出。