Python如何测试stdout输出

问题

你的程序中有个方法会输出到标准输出中(sys.stdout)。也就是说它会将文本打印到屏幕上面。 你想写个测试来证明它,给定一个输入,相应的输出能正常显示出来。

解决方案

使用 unittest.mock 模块中的 patch() 函数, 使用起来非常简单,可以为单个测试模拟 sys.stdout 然后回滚, 并且不产生大量的临时变量或在测试用例直接暴露状态变量。

作为一个例子,我们在 mymodule 模块中定义如下一个函数:

# mymodule.py

def urlprint(protocol, host, domain):
  url = '{}://{}.{}'.format(protocol, host, domain)
  print(url)

默认情况下内置的 print 函数会将输出发送到 sys.stdout 。 为了测试输出真的在那里,你可以使用一个替身对象来模拟它,然后使用断言来确认结果。 使用 unittest.mock 模块的 patch() 方法可以很方便的在测试运行的上下文中替换对象, 并且当测试完成时候自动返回它们的原有状态。下面是对 mymodule 模块的测试代码:

from io import StringIO
from unittest import TestCase
from unittest.mock import patch
import mymodule

class TestURLPrint(TestCase):
  def test_url_gets_to_stdout(self):
    protocol = 'http'
    host = 'www'
    domain = 'example.com'
    expected_url = '{}://{}.{}\n'.format(protocol, host, domain)

    with patch('sys.stdout', new=StringIO()) as fake_out:
      mymodule.urlprint(protocol, host, domain)
      self.assertEqual(fake_out.getvalue(), expected_url)

讨论

urlprint() 函数接受三个参数,测试方法开始会先设置每一个参数的值。 expected_url 变量被设置成包含期望的输出的字符串。

unittest.mock.patch() 函数被用作一个上下文管理器,使用 StringIO 对象来代替 sys.stdout . fake_out 变量是在该进程中被创建的模拟对象。 在with语句中使用它可以执行各种检查。当with语句结束时,patch 会将所有东西恢复到测试开始前的状态。 有一点需要注意的是某些对Python的C扩展可能会忽略掉 sys.stdout 的配置而直接写入到标准输出中。 限于篇幅,本节不会涉及到这方面的讲解,它适用于纯Python代码。 如果你真的需要在C扩展中捕获I/O,你可以先打开一个临时文件,然后将标准输出重定向到该文件中。

以上就是Python如何测试stdout输出的详细内容,更多关于Python测试stdout输出的资料请关注我们其它相关文章!

(0)

相关推荐

  • python-sys.stdout作为默认函数参数的实现

    假设我们有以下虚拟函数: import sys def writeline(text, stream=sys.stdout): stream.write(text + ' ') with open('/path/to/file', 'w') as f: # writes to /path/to/file writeline('foo', f) # writes to standard output writeline('bar') 鉴于Python在定义时评估了函数的默认参数,将sys.stdo

  • Python中的sys.stdout.write实现打印刷新功能

    前言: 今天学习python的常用模块的时候,了解到了time模块和datetime模块,于是想在编译环境中实时打印出时间,不会换行,且打印的时候自动删除前一步打印出的时间(本质原理不是这样),而不是像print那样打印之后自动换行再重新打印. 想要直接看到效果及方法,请直接跳到后文 解决办法. 我们先来看看Print方法打印的效果: 代码: from datetime import datetime as dt import sys import time for i in range(5):

  • python中stdout输出不缓存的设置方法

    考虑以下python程序: 复制代码 代码如下: #!/usr/bin/env python import sys sys.stdout.write("stdout1 ")sys.stderr.write("stderr1 ")sys.stdout.write("stdout2 ")sys.stderr.write("stderr2 ") 其中的sys.stdout.write也可以换成print.运行这程序,你觉得会输出什么

  • 详解使用python的logging模块在stdout输出的两种方法

    详解使用python的logging模块在stdout输出 前言: 使用python的logging模块时,除了想将日志记录在文件中外,还希望在前台执行python脚本时,可以将日志直接输出到标准输出std.out中. 实现 logging模块可以有两种方法实现该功能: 方案一:basicconfig import sys import logging logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) 方案二:handler

  • Python如何测试stdout输出

    问题 你的程序中有个方法会输出到标准输出中(sys.stdout).也就是说它会将文本打印到屏幕上面. 你想写个测试来证明它,给定一个输入,相应的输出能正常显示出来. 解决方案 使用 unittest.mock 模块中的 patch() 函数, 使用起来非常简单,可以为单个测试模拟 sys.stdout 然后回滚, 并且不产生大量的临时变量或在测试用例直接暴露状态变量. 作为一个例子,我们在 mymodule 模块中定义如下一个函数: # mymodule.py def urlprint(pro

  • python实时获取外部程序输出结果的方法

    如下所示: s=subprocess.Popen("ping baidu.com -t",bufsize=0,stdout=subprocess.PIPE,universal_newlines=True) while True: nextline=s.stdout.readline() print(nextline.strip()) if nextline=="" and scan.poll()!=None: break 以上这篇python实时获取外部程序输出结果

  • python让列表倒序输出的实例

    如下所示: a = [0,1,2,3,4,5,6,7,8,9] b = a[i:j] 表示复制a[i]到a[j-1],以生成新的list对象 b = a[1:3] 那么,b的内容是 [1,2] 当i缺省时,默认为0,即 a[:3]相当于 a[0:3] 当j缺省时,默认为len(alist), 即a[1:]相当于a[1:10] 当i,j都缺省时,a[:]就相当于完整复制一份a了 b = a[i:j:s]这种格式呢,i,j与上面的一样,但s表示步进,缺省为1. 所以a[i:j:1]相当于a[i:j]

  • Python 运行 shell 获取输出结果的实例

    首先使用内置模块os. >>> import os >>> code = os.system("pwd && sleep 2") # /User/zhipeng >>> print code # 0 问题是 os.system 只能获取到结束状态 使用内置模块 subprocess >>> import subprocess >>> subprocess.Popen("p

  • python自动化报告的输出用例详解

    1.设计简单的用例 2.设计用例 以TestBaiduLinks.py命名 # coding:utf-8 from selenium import webdriver import unittest class BaiduLinks(unittest.TestCase): def setUp(self): base_url = 'https://www.baidu.com' self.driver = webdriver.Chrome() self.driver.implicitly_wait(

  • python tornado修改log输出方式

    sed -i 's/StreamHandler()/StreamHandler(sys.__stdout__)/' /opt/python/python3/lib/python3.6/site-packages/tornado/log.py 将手动打印的后台信息输出到stdout,重定向到文件 设置时区: timedatectl set-timezone 'Asia/Shanghai' 启动项目: nohup python3 cluster.py >> logs/deploy.log &

  • python渗透测试linux密码激活的示例

    上篇文章给大家介绍过 Python脚本破解Linux口令(crypt模块)  感兴趣的朋友点击查看. linux密码破解 这段代码通过分别读取两个文件,一个为加密口令文件(cryptPass),另一个为用于猜测的字典文件(key.txt). 在testPass()函数中读取字典文件,并通过crypt.crypt()进行加密,加密时需要一个明文密码以及两个字节salt(加密口令的前两个字母),通过salt和明文密码加密形成 cryptWord. 最后将cryptWord和cryptPass进行对比

  • python游戏测试工具自动化遍历游戏中所有关卡

    目录 场景 思路 实现细节 1.卡住的判定和处理 2.GAutomator 调用游戏内部的 GM 指令 unity 中: python 中: 3.最终输出的报告 详细代码 AutoBattleTest.py 用来实现核心逻辑 ExcelTool.py 用来读写表格 后记 场景 游戏里有很多关卡(可能有几百个了),理论上每次发布到外网前都要遍历各关卡看看会不会有异常,上次就有玩家在打某个关卡时卡住不动了,如果每个关卡要人工遍历这样做会非常的耗时,所以考虑用自动化的方式来实现. 思路 游戏的战斗是有

  • Python实现测试磁盘性能的方法

    本文实例讲述了Python实现测试磁盘性能的方法.分享给大家供大家参考.具体如下: 该代码做了如下工作: create 300000 files (512B to 1536B) with data from /dev/urandom rewrite 30000 random files and change the size read 30000 sequential files read 30000 random files delete all files sync and drop cac

随机推荐