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程序设计入门(1)基本语法简介
Jun 13 Python
Python多线程编程简单介绍
Apr 13 Python
为Python的web框架编写前端模版的教程
Apr 30 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
浅谈Python 对象内存占用
Jul 15 Python
Python入门教程之运算符与控制流
Aug 17 Python
Python编程在flask中模拟进行Restful的CRUD操作
Dec 28 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
详解pytorch tensor和ndarray转换相关总结
Sep 03 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
Oct 15 Python
在 Python 中利用 Pool 进行多线程
Apr 24 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
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
thinkphp模板用法和内容输出实例
2014/11/28 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
JS自动适应的图片弹窗实例
2013/06/29 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
基于javascript实现图片预加载
2016/01/05 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
2016/02/12 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
Python基础教程之tcp socket编程详解及简单实例
2017/02/23 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
四年的个人工作自我评价
2013/12/10 职场文书
4s店总经理岗位职责
2013/12/31 职场文书
药学专业个人的自我评价
2013/12/31 职场文书
车辆安全检查制度
2014/01/12 职场文书
餐饮采购员岗位职责
2014/03/15 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
2016廉洁从政心得体会
2016/01/19 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏
vue 自定义组件添加原生事件
2022/04/21 Vue.js