python - 用 Nose 捕获 subprocess.Popen() 的输出

标签 python nose nosetests

我正在使用 nose测试使用 subprocess.Popen() 调用脚本的应用程序。 capture 都不是或 logcapture插件似乎捕获了这个脚本的输出。有没有一种简单的方法可以将此输出通过管道传输到 Nose ?

这是我到目前为止所做的尝试;请注意“捕获我”未被捕获:

example.py:

if __name__ == '__main__':
    print 'Capture me'

测试.py:

import subprocess
import sys


def test_popen():
    # nose's capture plugin replaces sys.stdout with a StringIO instance.
    # subprocess.Popen() expects stdout to have a fileno property, which
    # StringIO doesn't, so fake it.
    sys.stdout.fileno = lambda: 1

    subprocess.Popen(['python', 'example.py'], stdout=sys.stdout)
    assert False # Force test to fail so we see nose output

输出:

$ nosetests test.py
F
======================================================================
FAIL: test.test_popen
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/pmdarrow/Envs/example/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/pmdarrow/Code/example/API/test.py", line 8, in test_popen
    assert False
AssertionError

----------------------------------------------------------------------
Ran 1 test in 0.004s

FAILED (failures=1)
Capture me

最佳答案

您必须注意几个问题。我可能会重复@arbunet 的回答,但请耐心等待。因此,如果您等待进程完成,并将进程的标准输出重定向到测试的标准输出,一切都会被 nose 正确捕获:

import subprocess
import sys

def test_popen():
    p = subprocess.Popen(['python', 'example.py'], stdout=subprocess.PIPE)
    out, err = p.communicate()
    print out

    assert False

这里创建了 PIPE 并使用 print 语句将其重定向到标准输出。或者,您可以将 sys.__stdout__(未受干扰的测试标准输出)或其他文件描述符传递给 Popen 调用,然后将其刷新到 sys.stdout(由 nose 创建的 StringIO.StringIO 实例),但是它看起来不太干净(与简单的打印语句相比)。

关于python - 用 Nose 捕获 subprocess.Popen() 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23679431/

相关文章:

python - 所有行都期望第 0 行

python - Pip 没有安装 Nose 包

python - 如何在 PyCharm 中禁用 -u 解释器选项?

python - 自动化测试中如何初始化 session 数据? (python 2.7、webpy、nosetests)

Python,无法让 assert_raises 正常工作

python - 延迟任务创建无法访问某些 python 模块的新实例

python - 使用 Python Selenium 单击单选按钮

python - 如何解决Python套接字/套接字服务器连接[Errno 10048]和[Errno 10049]?

python - 是否可以从 nose 插件访问类级属性?

python - 如何禁用 nosetest 插件