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
子进程运行服务器
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)。你能给我一个机会吗?