【Python】使用unittest.mock测试控制台输出是否正确

文章介绍了在Python中进行测试驱动开发时,如何针对使用print()函数的代码进行单元测试。通过使用unittest.mock库的patch装饰器或with语句,结合io.StringIO,可以捕获并验证print的输出内容。提供了三种不同的实现方式,包括仅使用装饰器、使用with语句以及结合assert_has_calls进行更详细的断言。
摘要由CSDN通过智能技术生成

本文是针对Python单体测试模块使用有兴趣的童鞋。 同时也来自昨天一名PMP的同学的讨论。 感谢小袁童鞋~

unittest.TestCase提供了很多assert方法来帮助我们做测试。 这针对属性、变量、返回值等内容非常有效。
但是针对print()返回的控制台输出就没有那么简单了。 这里列举了三种测试控制台输出的方法。

  1. 使用装饰器@patch
  2. 使用with语句
  3. 使用with语句,同时使用assert_has_calls ( [assert_has_calls]文档 )

编码原则是能用系统库就用系统库,减少学习成本。 python.unittest的官方文档请参考如下链接:Python官方文档

from unittest import mock
from unittest.mock import patch
import io

def foo():
    print("田豆芽~あいうえお~hello")

# 方法1, 只用装饰器 @patch
@patch('sys.stdout', new_callable=io.StringIO)
def test_foo_one(mock_stdout):
    foo()
    assert mock_stdout.getvalue() == '田豆芽~あいうえお~hello\n'

# 方法2, 使用with语句
def test_foo_two():
    with mock.patch('sys.stdout', new=io.StringIO()) as fake_stdout:
        foo()

    assert fake_stdout.getvalue() == '田豆芽~あいうえお~hello\n'

# 方法3, 使用with语句和assert_has_calls
def test_foo_three():
    with mock.patch('sys.stdout') as fake_stdout:
        foo()

    fake_stdout.assert_has_calls([
        mock.call.write('田豆芽~あいうえお~hello'),
        mock.call.write('\n')
    ])

运行结果
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

田辛 | 田豆芽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值