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实现读取json文件到excel表
Nov 18 Python
python正则中最短匹配实现代码
Jan 16 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
Apr 17 Python
Python实现获取前100组勾股数的方法示例
May 04 Python
使用Python处理BAM的方法
Sep 28 Python
python实现简易动态时钟
Nov 19 Python
Django自定义用户登录认证示例代码
Jun 30 Python
python orm 框架中sqlalchemy用法实例详解
Feb 02 Python
详解pycharm配置python解释器的问题
Oct 15 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
python随机打印成绩排名表
Jun 23 Python
Opencv实现二维直方图的计算及绘制
Jul 21 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脚本数据库功能详解(下)
2006/10/09 PHP
PHP spl_autoload_register实现自动加载研究
2011/12/06 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
PHP fopen中文文件名乱码问题解决方案
2020/10/28 PHP
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
2017/02/18 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
详解基于Vue2.0实现的移动端弹窗(Alert, Confirm, Toast)组件
2018/08/02 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
2019/04/30 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
[54:02]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 IG vs VGJ.T
2018/04/03 DOTA
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
什么是python类属性
2020/06/10 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
Speedo速比涛德国官方网站:世界领先的泳装品牌
2019/08/26 全球购物
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
信息工程学院毕业生推荐信
2013/11/05 职场文书
经理职责范文
2013/11/08 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers