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 相关文章推荐
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
详解Python中的from..import绝对导入语句
Jun 21 Python
Python numpy 提取矩阵的某一行或某一列的实例
Apr 03 Python
python实现对求解最长回文子串的动态规划算法
Jun 02 Python
python保存文件方法小结
Jul 27 Python
python实现弹跳小球
May 13 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
python 环境搭建 及python-3.4.4的下载和安装过程
Jul 20 Python
python3读取csv文件任意行列代码实例
Jan 13 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 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 遍历数据表数据并列表横向排列的代码
2009/09/05 PHP
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
JavaScript实现打开链接页面的方式汇总
2016/06/02 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
Python可变参数函数用法实例
2015/07/07 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
法国足球商店:Footcenter
2019/07/06 全球购物
南京某公司笔试题
2013/01/27 面试题
美德少年事迹材料
2014/01/23 职场文书
11月升旗仪式讲话稿
2014/02/15 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
学员自我鉴定
2014/03/19 职场文书
个人工作表现评语
2014/04/30 职场文书
交通事故被告代理词
2015/05/23 职场文书
辩论赛主持人开场白
2015/05/29 职场文书
react中props 的使用及进行限制的方法
2021/04/28 Javascript
Navicat连接MySQL错误描述分析
2021/06/02 MySQL
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers