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数据库操作常用功能使用详解(创建表/插入数据/获取数据)
Dec 06 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
Jun 27 Python
go和python变量赋值遇到的一个问题
Aug 31 Python
Python中的CSV文件使用"with"语句的方式详解
Oct 16 Python
在numpy矩阵中令小于0的元素改为0的实例
Jan 26 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
python实现合并多个list及合并多个django QuerySet的方法示例
Jun 11 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
python对Excel的读取的示例代码
Feb 14 Python
jupyter notebook 实现matplotlib图动态刷新
Apr 22 Python
在matplotlib中改变figure的布局和大小实例
Apr 23 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 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/11/14 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
2012/10/06 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
单击和双击事件的冲突处理示例代码
2014/04/03 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
详解python3实现的web端json通信协议
2016/12/29 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
2019/08/21 Python
Python Selenium 设置元素等待的三种方式
2020/03/18 Python
Python实现定时监测网站运行状态的示例代码
2020/09/30 Python
Python random模块的使用示例
2020/10/10 Python
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
工程造价自荐信
2013/10/09 职场文书
个人近期表现材料
2014/02/11 职场文书
授权委托书格式范文
2014/08/02 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
2015年党员自评材料
2014/12/17 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
2015年餐厅服务员工作总结
2015/04/23 职场文书
投资申请报告
2015/05/19 职场文书
环境卫生整治简报
2015/07/20 职场文书
SQLServer2008提示评估期已过解决方案
2021/04/12 SQL Server