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多线程编程(一):threading模块综述
Apr 05 Python
python中的计时器timeit的使用方法
Oct 20 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
用 Python 连接 MySQL 的几种方式详解
Apr 04 Python
Python logging模块用法示例
Aug 28 Python
python3.6编写的单元测试示例
Aug 17 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
Sep 04 Python
Python自动化完成tb喵币任务的操作方法
Oct 30 Python
Ubuntu16.04安装python3.6.5步骤详解
Jan 10 Python
Python django框架开发发布会签到系统(web开发)
Feb 12 Python
python实现凯撒密码、凯撒加解密算法
Jun 11 Python
关于python中remove的一些坑小结
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生成随机密码的几种方法
2011/01/17 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
Yii使用migrate命令执行sql语句的方法
2016/03/15 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
javascript的对话框详解与参数
2007/03/08 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
2017/02/09 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
2018/09/14 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
jupyter安装小结
2016/03/13 Python
python difflib模块示例讲解
2017/09/13 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
2018/01/15 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
庆八一活动方案
2014/01/25 职场文书
工程质量承诺书
2014/03/27 职场文书
2014年物流工作总结
2014/11/25 职场文书
2014年精神文明工作总结
2014/12/23 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
vue实现无缝轮播效果(跑马灯)
2021/05/14 Vue.js
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python