从pytest.main()

时间:2017-12-13 02:52:42

标签: python pytest

有没有办法通过使用对main的调用来获取通过pytest运行的测试的输出?

string = "-x mytests.py"
pytest.main(string)
print(????????)

如果这是一个过程,我可以使用communicate()获取输出,但是当我从Python3运行它作为函数时,我找不到pytest的等价物,而不是从终端独立运行它。

编辑: 我确实尝试使用sys.stdout但它也没有用...我基本上被卡住了,因为我无法以任何方式得到pytest输出;在我的输出IDE窗口旁边。任何建议或解决方法都会非常感激。

2 个答案:

答案 0 :(得分:2)

通过一个不同的问题找到答案,该问题提到了如何重定向整个stdout流。

我没有找到打印pytest消息的方法;但我可以通过这种方式在字符串变量中从屏幕输出重定向stdio:

import sys
from io import StringIO

def myfunctionThatDoesSomething():

    # Save the original stream output, the console basically
    original_output = sys.stdout
    # Assign StringIO so the output is not sent anymore to the console
    sys.stdout = StringIO()
    # Run your Pytest test
    pytest.main(script_name)
    output = sys.stdout.getvalue()
    # close the stream and reset stdout to the original value (console)
    sys.stdout.close()
    sys.stdout = original_output

    # Do whatever you want with the output
    print(output.upper())

希望这有助于任何人寻找从pytest输出中检索数据的方法,同时找到一个更好的解决方案来获取变量中的pytest输出。

答案 1 :(得分:0)

从Python 3.4开始(根据the docs),有一种更简单的方法可以完成您要执行的操作:

from io import StringIO
from contextlib import redirect_stdout

temp_stdout = StringIO()
with redirect_stdout(temp_stdout):
    result = pytest.main(sys.argv)
stdout_str = temp_stdout.getvalue()
# or whatever you want to do with it
print(stdout_str.upper())