当前位置: 首页 > news >正文

边走边聊 Python 3.8:Chapter 20:测试与调试

Chapter 20:测试与调试

没有测试的代码,只是侥幸能跑。本章将带你理解单元测试、断言、覆盖率、调试技巧等关键能力,并通过真实项目展示如何让代码更可靠。你会体验到:当你能信任自己的代码,你的开发速度会更快。


“没有测试的代码,只是侥幸能跑。”

大家好,我是 Q。第20篇我们从“写代码”升级到“写好代码”,重点学习unittest / pytest测试框架、pdb + VS Code断点调试,以及logging日志记录。
本篇全部基于Python 3.8.10 + Win7 旗舰版实测通过,特别针对“知识库项目”(即前19篇积累的 AutoOffice 自动化脚本)增加完整测试用例。
先讲底层原理,再讲Win7 实战坑点,最后给出TDD 思维 + 覆盖率报告可直接复制的测试代码,让你的脚本从“能跑”变成“稳跑”。

1. 底层原理(源码、协议、机制)

  • unittest:Python 标准库(Lib/unittest/init.py),采用xUnit 架构(JUnit 风格)。
    核心机制:通过TestCase类 +TestLoader发现测试 →TestRunner执行 →TestResult收集结果。
    源码里用inspect模块反射调用setUp/tearDown,完全基于 Python 对象协议,无需额外进程。

  • pytest:第三方框架(更现代),底层依然调用unittest兼容层,但自己实现了插件架构(pluggy)。
    发现机制:pytest遍历目录,匹配test_*.py*_test.py,用pytest.Item封装。
    Fixture(@pytest.fixture)基于依赖注入,比 unittest 的 setUp 更灵活。

  • pdb(Python Debugger):标准库Lib/pdb.py,基于bdb(Breakpoint Debugger)模块。
    原理:插入pdb.set_trace()后,接管sys.trace回调,逐行执行并暴露(Pdb)命令行。

  • logging:标准库Lib/logging/__init__.py,采用Logger → Handler → Formatter层次结构。
    日志记录是线程安全的(使用Lock),支持多 Handler(文件、控制台、SMTP 等)。底层用LogRecord对象传递消息。

这些机制都是纯 Python + sys 钩子,在 Win7 上零依赖,运行极轻量。

(上图:pytest vs unittest 架构对比,一目了然)

2. Win7 特有实战坑点 & 库兼容性(提前避雷)

  1. logging 中文乱码(Win7 经典问题):
    默认FileHandler用系统编码(cp1252),中文会报UnicodeEncodeError: 'charmap' codec can't encode character
    解决:必须显式encoding='utf-8'

  2. pytest 版本选择
    新版 pytest(9.0+)已放弃 Python 3.8 支持。Win7 + Python 3.8 推荐 pytest==6.2.5 或 7.4.4(兼容性最佳)。

  3. coverage.py 安装
    Win7 下有时无法自动编译 C 扩展(缺少 Visual C++ Redistributable)。
    推荐pip install coverage==6.5.0(最后一个稳定支持 3.8 的版本),或提前安装wheel

  4. VS Code 调试器
    Python 扩展在 Win7 上正常,但需手动选择 Python 3.8 解释器。pdb 与 debugpy 配合完美,无卡顿。

  5. 路径与权限
    测试脚本放在D:\AutoOffice\tests\短路径,避免 Win7 长路径限制。

3. 深度:TDD 思维 + Win7 下覆盖率报告生成

TDD(Test Driven Development)核心循环
Red(写失败测试) → Green(写刚好让测试通过的代码) → Refactor(重构保持测试通过)

(上图:经典 Red-Green-Refactor 循环)

Win7

http://www.jsqmd.com/news/840856/

相关文章:

  • 从《魔城迷踪》到3D高斯溅射:图形学中那些‘非主流’几何表达的奇妙复兴
  • 别再手动点选了!用Python脚本5分钟搞定Abaqus批量加载节点力(附完整代码)
  • java小题练习
  • 为ClaudeCode配置Taotoken作为稳定可靠的API供应商
  • Mac清理终极指南:3步彻底卸载应用残留,Pearcleaner免费开源解决方案
  • 对比自行维护多个API密钥使用Taotoken统一管理的便捷性体验
  • 基于大语言模型的AI代理:自主循环执行系统任务的技术解析与实践
  • CodexPool:基于向量语义搜索的智能代码索引与检索系统实践
  • Unity 5.6移动VR开发与单通道渲染优化指南
  • 2026嵌入式培训怎么选?一个工程师的3条硬核判断标准
  • Web架构师工具箱:从工程化实践到现代化Web开发全流程
  • 任天堂Switch模拟器终极指南:2小时从零到精通PC游戏体验
  • 5分钟快速上手Figma中文界面:设计师必备的终极汉化插件指南
  • Node.js服务端项目如何集成Taotoken管理多模型调用与成本
  • 04-内存管理
  • WeChatExporter:将你的数字记忆转化为永恒的数字档案
  • 西安小程序制作优质服务推荐
  • 目标追踪算法选型指南:DeepSORT的“精致”与ByteTrack的“高效”,你的业务场景更适合谁?
  • 面试官问:什么是 Harness 工程?可以这样回答
  • CefFlashBrowser完整使用手册:在2025年拯救你的Flash游戏与存档
  • 即梦视频怎样去水印?即梦去水印软件2026实测对比,哪款工具最好用 - 科技热点发布
  • 基于MCP协议实现AI安全访问MongoDB:架构、部署与安全实践
  • Rust嵌入式开发实战:开源机械爪控制库openclaw-rs架构解析与应用
  • 为ClaudeCode配置Taotoken解决密钥与额度烦恼
  • EvoAgentX智能体开发框架:模块化架构与进化引擎解析
  • Windows平台终极APK安装指南:无需模拟器的Android应用部署方案
  • 深度解析 amanasmuei/amem 镜像:容器化开发环境实践指南
  • 晶圆为何是圆形而芯片是方形?揭秘半导体制造的工程智慧
  • 别再傻傻分不清USART_FLAG_TXE和TC了!STM32串口发送字符/字符串的实战避坑指南
  • 面向对象设计与构造-对于PTA作业1-3的总结与思考 - 彭梓鑫