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实现抓取页面上链接的简单爬虫分享
Jan 21 Python
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
Mar 31 Python
使用httplib模块来制作Python下HTTP客户端的方法
Jun 19 Python
python3+PyQt5实现自定义窗口部件Counters
Apr 20 Python
python绘制热力图heatmap
Mar 23 Python
用python代码将tiff图片存储到jpg的方法
Dec 04 Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 Python
Python hashlib常见摘要算法详解
Jan 13 Python
Python for循环搭配else常见问题解决
Feb 11 Python
Python函数递归调用实现原理实例解析
Aug 11 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
Python通过yagmail实现发送邮件代码解析
Oct 27 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
PHP房贷计算器实例代码,等额本息,等额本金
2017/04/01 PHP
PHP获取MySQL执行sql语句的查询时间方法
2018/08/21 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
jquery实现华丽的可折角广告代码
2015/09/02 Javascript
Node.js操作Firebird数据库教程
2016/03/04 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
解决vue attr取不到属性值的问题
2018/09/18 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
python 获取et和excel的版本号
2009/04/09 Python
python实现得到一个给定类的虚函数
2014/09/28 Python
python中pygame模块用法实例
2014/10/09 Python
python中随机函数random用法实例
2015/04/30 Python
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
Python OpenCV获取视频的方法
2018/02/28 Python
Python学生信息管理系统修改版
2018/03/13 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
python cv2.resize函数high和width注意事项说明
2020/07/05 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
计算机应用与科学个人的自我评价
2013/11/15 职场文书
股份转让协议书范本
2015/01/27 职场文书
2015年个人思想总结
2015/03/09 职场文书
三八节活动主持词
2015/07/04 职场文书
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android
Python线程池与GIL全局锁实现抽奖小案例
2022/04/13 Python