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 调用Java实例详解
Jun 02 Python
pandas 小数位数 精度的处理方法
Jun 09 Python
python实现猜数字小游戏
Mar 24 Python
selenium+python自动化测试之页面元素定位
Jan 23 Python
将pip源更换到国内镜像的详细步骤
Apr 07 Python
Python数据分析pandas模块用法实例详解
Nov 20 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 Python
Python离线安装各种库及pip的方法
Nov 28 Python
如何利用opencv判断两张图片是否相同详解
Jul 07 Python
详解python的异常捕获
Mar 03 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
自己动手,丰衣足食 - 短波框形天线制作
2021/03/01 无线电
php 一元分词算法
2009/11/30 PHP
PHP写UltraEdit插件脚本实现方法
2011/12/26 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
PHP生成随机字符串实例代码(字母+数字)
2019/09/11 PHP
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
详解node字体压缩插件font-spider的用法
2018/09/28 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
vue axios重复点击取消上一次请求封装的方法
2019/06/19 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
[01:08]DOTA2次级职业联赛 - Shield战队宣传片
2014/12/01 DOTA
使用Python实现一个简单的项目监控
2015/03/31 Python
python for循环输入一个矩阵的实例
2018/11/14 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
Python turtle库的画笔控制说明
2020/06/28 Python
python如何删除列为空的行
2020/07/17 Python
Python爬虫实现自动登录、签到功能的代码
2020/08/20 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
人事部岗位职责范本
2014/03/05 职场文书
幼儿评语大全
2014/04/30 职场文书
户外宣传策划方案
2014/05/25 职场文书
初中体育教学随笔
2015/08/15 职场文书
初中生物教学反思
2016/02/20 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
2021-4-3课程——SQL Server查询【2】
2021/04/05 SQL Server
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers