Python如何测试stdout输出


Posted in Python onAugust 10, 2020

问题

你的程序中有个方法会输出到标准输出中(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输出的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现的监测服务器硬盘使用率脚本分享
Nov 07 Python
python图像处理之镜像实现方法
May 30 Python
Python统计单词出现的次数
Apr 04 Python
关于Tensorflow中的tf.train.batch函数的使用
Apr 24 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
python 提取tuple类型值中json格式的key值方法
Dec 31 Python
Python爬取数据保存为Json格式的代码示例
Apr 09 Python
PyTorch中的Variable变量详解
Jan 07 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
May 26 Python
python执行js代码的方法
May 13 Python
浅析Python实现DFA算法
Jun 26 Python
Python3 ffmpeg视频转换工具使用方法解析
Aug 10 #Python
常用的10个Python实用小技巧
Aug 10 #Python
推荐值得学习的12款python-web开发框架
Aug 10 #Python
python多线程semaphore实现线程数控制的示例
Aug 10 #Python
如何在python中实现线性回归
Aug 10 #Python
Python多线程的退出控制实现
Aug 10 #Python
Python进行统计建模
Aug 10 #Python
You might like
sony ICF-2010 拆解与改装
2021/03/02 无线电
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
2019/06/12 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
javascript 写类方式之四
2009/07/05 Javascript
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
javascript类型转换示例
2014/04/29 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
JavaScript简单拖拽效果(1)
2017/05/17 Javascript
javascript 作用于作用域链的详解
2017/09/27 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
python 获取字符串MD5值方法
2018/05/29 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
详解Python locals()的陷阱
2019/03/26 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
美国南加州的原创极限运动潮牌:Vans(范斯)
2016/08/05 全球购物
Banana Republic欧盟:美国都市简约风格的代表品牌
2018/05/09 全球购物
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
幼儿教师个人求职信范文
2013/09/21 职场文书
教师试用期自我鉴定
2014/02/12 职场文书
皇城相府导游词
2015/02/06 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS