Python 从业十年是种什么体验?老程序员的一篇万字经验分享( 六 )


通过努力地写测试 , 会强迫你开始编写精简、功能单一、无状态、依赖注入、避免链式调用的函数 。
一个简单直观的“好坏对比” , 链式调用的函数很难测试 , 它内含了太多其他函数的调用 , 一旦测试就变成了一个“集成测试” 。 而将其按照步骤一一拆分后 , 就可以对其进行精细化的“单元测试” , 这可以契合你开发的步伐 , 步步为营稳步推进 。
"""这是很糟糕的链式调用"""def main:func1def func1:return func2def func2:return func3def func3:return "shit""""这样写会好很多"""def step1:return "yoo"def step2(v):return f"hello, {v}"def step3(v):return f"you know nothing, {v}"def main:r1 = step1r2 = step2(r1)step3(r2)顺带一提 , 对于一些无法绕开的外部调用 , 如网络请求、数据库请求 。 单元测试的准则之一就是“排除一切外部因素” , 你不应该发起任何真正的外部调用的 , 因为这会引入不可控的数据 。 正确做法是通过依赖注入 Mock 对象 , 或者通过 patch 去改写调用的接口对象 。
以前写过一篇简介:
单元测试应该兼顾黑盒、白盒 。 你既应该编写面对接口的案例 , 也应该尽可能的试探内部的实现路径(增加覆盖率) 。
你还可以逐渐地把线上遇到的各种 bug 都编写为案例 , 这些案例会成为项目宝贵的财富 , 为回归测试提供强有力的支持 。 而且有这么多测试案例提供保护 , coding 的时候也会安心很多 。
在单元测试的基础上 , 人们发展出了 TDD , 但是在实践的过程中 , 发现有些“狡猾的”开发会针对案例的特例进行编程 。 为此 , 人们决定应该抛弃形式 , 回归本源 , 从方法论的高度来探寻测试的道路 。 其中光明一方 , 就是 PBT , 试图通过描述问题的实质 , 来自动生成测试案例 。
一篇简介:
另一个黑暗的方向就是 Fuzzing , 它干脆完全忽略函数的实现 , 贯彻黑盒到底 , 通过遗传算法 , 随机的生成入参 , 以测试到宇宙尽头的决心 , 对函数进行死缠烂打 , 发掘出正常人根本想不到猜不着的犄角旮旯里的 bug 。
*声明:本文于网络整理 , 版权归原作者所有 , 如来源信息有误或侵犯权益 , 请联系我们删除或授权事宜 。
今天给大家推荐一本机器学习、深度学习的人都应该听说过一本经典教材:《Pattern Recognition and Machine Learning》 , 中文译名《模式识别与机器学习》 , 简称 PRML 。 出自微软剑桥研究院实验室主任 Christopher Bishop 大神之手 。 对 , 就是豆瓣评分 9.5 的这本书 。
Python 从业十年是种什么体验?老程序员的一篇万字经验分享文章插图
资料获取方法
2. 后台回复关键词:PRML
回复「PRML」即可获取资料