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 Web服务器Tornado使用小结
May 06 Python
使用Python的Django框架实现事务交易管理的教程
Apr 20 Python
python模块smtplib实现纯文本邮件发送功能
May 22 Python
matplotlib subplots 调整子图间矩的实例
May 25 Python
python 获取一个值在某个区间的指定倍数的值方法
Nov 12 Python
django与小程序实现登录验证功能的示例代码
Feb 19 Python
numpy.where() 用法详解
May 27 Python
Python之关于类变量的两种赋值区别详解
Mar 12 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 Python
python模拟实现分发扑克牌
Apr 22 Python
python实现二分查找算法
Sep 18 Python
python空元组在all中返回结果详解
Dec 15 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
配置支持SSI
2006/11/25 PHP
PHP页面间传递参数实例代码
2008/06/05 PHP
PHP5.4中json_encode中文转码的变化小结
2013/01/30 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
thinkphp3.2实现跨控制器调用其他模块的方法
2017/03/14 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
jQuery each()方法的使用方法
2010/03/18 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
angularjs下拉框空白的解决办法
2017/06/20 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
Vue自定义指令详解
2017/07/28 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
2019/04/10 jQuery
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
使用vue-router切换页面时实现设置过渡动画
2019/10/31 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
Python 图片处理库exifread详解
2021/02/25 Python
实例讲解CSS3中的box-flex弹性盒属性布局
2016/06/09 HTML / CSS
捷克钓鱼用品网上商店:Parys.cz
2018/06/15 全球购物
团队精神演讲稿
2013/12/31 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
SQL Server实现分页方法介绍
2022/03/16 SQL Server
Nginx实现负载均衡的项目实践
2022/03/18 Servers