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实现的多线程端口扫描工具分享
Jan 21 Python
Python中函数的参数传递与可变长参数介绍
Jun 30 Python
python获取局域网占带宽最大3个ip的方法
Jul 09 Python
python中常用的九种预处理方法分享
Sep 11 Python
Python使用struct处理二进制的实例详解
Sep 11 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
python实现扫描ip地址的小程序
Apr 16 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
python文本数据处理学习笔记详解
Jun 17 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
Apr 07 Python
python如何调用java类
Jul 05 Python
python用opencv 图像傅里叶变换
Jan 04 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_MySQL教程-第一天
2007/03/18 PHP
坏狼php学习 计数器实例代码
2008/06/15 PHP
php 什么是PEAR?(第二篇)
2009/03/19 PHP
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
php中文验证码实现方法
2015/06/18 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
jQuery实现延迟跳转的方法
2015/06/05 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
2016/09/08 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
vue.js iview打包上线后字体图标不显示解决办法
2020/01/20 Javascript
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
Python实现CET查分的方法
2015/03/10 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
Python聚类算法之基本K均值实例详解
2015/11/20 Python
在Django同1个页面中的多表单处理详解
2017/01/25 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
接口可以包含哪些成员
2012/09/30 面试题
运动会通讯稿100字
2014/01/31 职场文书
基层党员群众路线教育实践活动个人对照检查材料思想汇报
2014/10/05 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
遗愿清单观后感
2015/06/09 职场文书
清明节随笔
2015/08/15 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书
SQL 窗口函数实现高效分页查询的案例分析
2021/05/21 SQL Server
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB