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使用函数默认值实现函数静态变量的方法
Aug 18 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
Jun 24 Python
在Python中使用正则表达式的方法
Aug 13 Python
python机器学习之神经网络(一)
Dec 20 Python
python通过getopt模块如何获取执行的命令参数详解
Dec 29 Python
Python实现抢购IPhone手机
Feb 07 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
Feb 12 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
python使用openpyxl操作excel的方法步骤
May 28 Python
keras model.fit 解决validation_spilt=num 的问题
Jun 19 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 设计模式之 单例模式
2008/12/19 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
JavaScript国旗变换效果代码
2008/08/13 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
ztree获取当前选中节点子节点id集合的方法
2015/02/12 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
2015/09/19 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
2016/10/31 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
javascript实现获取图片大小及图片等比缩放的方法
2016/11/24 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
React中的render何时执行过程
2018/04/13 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
React学习之受控组件与数据共享实例分析
2020/01/06 Javascript
python绘制评估优化算法性能的测试函数
2019/06/25 Python
python使用pandas处理excel文件转为csv文件的方法示例
2019/07/18 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
OpenCV 表盘指针自动读数的示例代码
2020/04/10 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
超市后勤自我鉴定
2014/01/17 职场文书
慈善晚会策划方案
2014/05/14 职场文书
小学运动会班级口号
2014/06/09 职场文书
简单租房协议书范本
2014/08/20 职场文书
乡镇镇长个人整改措施
2014/10/01 职场文书
毕业酒会致辞
2015/07/29 职场文书