Python 核心技术与实战
景霄
Facebook 资深工程师
114324 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
Python 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

30 | 真的有必要写单元测试吗?

重构代码以便写出高质量的单元测试
思考如何模块化代码
从测试的角度审视codebase
提高代码的正确性
衡量代码中语句被cover的百分比
快速自然地mock所需的函数
根据不同的输入返回不同的数值
通过虚假对象代替被测试函数或模块需要的对象
模块化
Test Coverage
patch
mock side effect
mock
运行单元测试
使用assert语句验证结果
定义测试函数
创建测试类
方便系统的维护
减小bug发生的可能性
提高代码质量
验证功能正确性
保证代码的稳定、高效、无误
高质量单元测试的关键
单元测试的技巧
Python单元测试代码设计与编写
单元测试方法
单元测试的价值
单元测试
真的有必要写单元测试吗?
参考文章

该思维导图由 AI 生成,仅供参考

你好,我是景霄。
说到 unit test(即单元测试,下文统一用中文称呼),大部分人的反应估计有这么两种:要么就是,单元测试啊,挺简单的呀,做不做无所谓吧;要么就是,哎呀,项目进度太赶,单元测试拖一拖之后再来吧。
显然,这两种人,都没有正确认识到单元测试的价值,也没能掌握正确的单元测试方法。你是不是觉得自己只要了解 Python 的各个 feature,能够编写出符合规定功能的程序就可以了呢?
其实不然,完成产品的功能需求只是很基础的一部分,如何保证所写代码的稳定、高效、无误,才是我们工作的关键。而学会合理地使用单元测试,正是帮助你实现这一目标的重要路径。
我们总说,测试驱动开发(TDD)。今天我就以 Python 为例,教你设计编写 Python 的单元测试代码,带你熟悉并掌握这一重要技能。

什么是单元测试?

单元测试,通俗易懂地讲,就是编写测试来验证某一个模块的功能正确性,一般会指定输入,验证输出是否符合预期。
实际生产环境中,我们会对每一个模块的所有可能输入值进行测试。这样虽然显得繁琐,增加了额外的工作量,但是能够大大提高代码质量,减小 bug 发生的可能性,也更方便系统的维护。
说起单元测试,就不得不提 Python unittest 库,它提供了我们需要的大多数工具。我们来看下面这个简单的测试,从代码中了解其使用方法:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文以Python为例,介绍了单元测试的重要性、概念、方法和技巧。首先强调了单元测试在软件开发中的重要性,能够提高代码质量、减少bug发生可能性,便于系统维护。文章详细介绍了Python中unittest库的使用方法,并提出了mock、side_effect和patch等技巧,通过虚假实现替换被测试函数的依赖项,帮助开发者集中精力进行功能测试。作者强调了高质量单元测试的重要性,指出低质量的单元测试可能无法验证代码正确性,浪费时间。此外,文章还提到了Test Coverage的重要性,以及模块化设计对于编写高质量单元测试的必要性。通过重构代码,使单元测试更加全面、精确,并且让整体架构、函数设计更美观。总结了单元测试的理念是先模块化代码设计,然后针对每个作用单元,编写单独的测试去验证其准确性。更好的模块化设计和更多的Test Coverage,是提高代码质量的核心。而单元测试的本质就是通过mock,去除掉不影响测试的依赖项,把重点放在需要测试的代码核心逻辑上。最后,强调了单元测试是保证代码质量和准确性必不可少的一环,适用于任何语言。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(34)

  • 最新
  • 精选
  • 咩小小
    我想问下一般单元测试是由写该代码的开发者写吗,那么测试开发工程师对单元测试的关注度跟开发者写的单元测试关注度有啥不一样呢,希望老师能讲一下

    作者回复: 我们公司的风格是单元测试都由开发者写的,因为代码就是开发者写的,当然单元测试也一并写了

    2020-04-27
    3
  • Claywoow
    一些大项目中的函数有文件的读写操作有必要mock掉吗

    作者回复: 最好也mock一下

    2019-07-17
    1
  • enjoylearning
    很喜欢写单测,通过后才会继续实现下一步功能

    作者回复: 嗯嗯,这个习惯很好

    2019-07-17
    1
  • return
    一直因为业务逻辑复杂,而不好做单元测试。 今天茅塞顿开。 感谢老师。

    作者回复: 谢谢你的支持

    2019-07-17
    1
  • Steven
    开始触及盲点了,其实平时很少定单元测试,感觉这一章的内容有点茫然,感觉说的都懂,但是又感觉不知道要拿来怎么用。
    2019-07-26
    1
    34
  • 美美
    pytest似乎比官方 unitest 更容易且更强大!
    2019-07-22
    1
    30
  • 盒子妮
    感谢老师的讲解,只是后面的side_effect和patch还是不明白该怎么用,后面如果有答疑的话希望老师详细讲一下。谢谢
    2019-07-31
    20
  • 黑客不够黑
    mock介绍还说得过去,side effect和patch在新手看来简直不知道在说什么
    2020-04-13
    2
    17
  • VincentBegins
    根据我的经验,在动手写代码前,先得有让代码testable的意识,使用DIP原则与dependency injection将业务逻辑代码与具体的平台实现代码解耦,平台实现代码包括数据库操作,文件读写,对rest api的调用,等等),尽量保持平台代码简单直接。 在写UT的时候,编写对平台的mock即可。
    2019-08-07
    1
    11
  • KaitoShy
    后面有几个代码没怎么看懂,希望老师详细说明一下: 1) from unittest.mock import patch @patch('sort') def test_sort(self, mock_sort): ... 文档上说这个是个patch()里面是个类,但老师这里表达的是函数? 2) @patch('%s.preprocess') 这个又是表达的什么的,运行后ModuleNotFoundError: No module named '%s'。 所以烦请老师把这块详细说明一下,不然感觉还是不怎么会使用
    2019-07-17
    4
    7
收起评论
显示
设置
留言
34
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部