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 29 Python
pygame学习笔记(3):运动速率、时间、事件、文字
Apr 15 Python
在ironpython中利用装饰器执行SQL操作的例子
May 02 Python
在unittest中使用 logging 模块记录测试数据的方法
Nov 30 Python
Python3实现的判断环形链表算法示例
Mar 07 Python
pyQt5实时刷新界面的示例
Jun 25 Python
简单了解Django应用app及分布式路由
Jul 24 Python
Python基本语法之运算符功能与用法详解
Oct 22 Python
在ipython notebook中使用argparse方式
Apr 20 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
May 24 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 Python
去除python中的字符串空格的简单方法
Dec 22 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实现网上点歌(二)
2006/10/09 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
js限制文本框只能输入中文的方法
2015/08/11 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
javascript常用经典算法实例详解
2015/11/25 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
基于bootstrap实现广告轮播带图片和文字效果
2016/07/22 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
2016/12/30 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
react build 后打包发布总结
2018/08/24 Javascript
浅谈vue的第一个commit分析
2020/06/08 Javascript
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python写的ARP攻击代码实例
2014/06/04 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
Python图像读写方法对比
2020/11/16 Python
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
解释一下钝化(Swap out)
2016/12/26 面试题
酒店管理专业毕业生推荐信
2013/11/10 职场文书
秋季婚礼证婚词
2014/01/11 职场文书
青春励志演讲稿
2014/04/29 职场文书
校园之声广播稿
2015/08/18 职场文书
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
一文搞懂Python Sklearn库使用
2021/08/23 Python
Python图片验证码降噪和8邻域降噪
2021/08/30 Python
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android
Netty客户端接入流程NioSocketChannel创建解析
2022/03/25 Java/Android