当前位置: 首页 > 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.zskr.cn/news/1312437.html

相关文章:

  • java小题练习
  • Mac清理终极指南:3步彻底卸载应用残留,Pearcleaner免费开源解决方案
  • 别再手动点选了!用Python脚本5分钟搞定Abaqus批量加载节点力(附完整代码)
  • 2026嵌入式培训怎么选?一个工程师的3条硬核判断标准
  • 基于大语言模型的AI代理:自主循环执行系统任务的技术解析与实践
  • Arm架构文档版本控制与嵌入式开发实践
  • 工业眼睛:05 机器视觉能做什么?缺陷检测、OCR、3D 全解析
  • 04-内存管理
  • Node.js服务端项目如何集成Taotoken管理多模型调用与成本
  • 高速PCB设计中反射问题的量化分析与工程实践
  • 面向对象设计与构造-对于PTA作业1-3的总结与思考 - 彭梓鑫
  • Kubernetes etcd备份恢复
  • Git核心工作流解析:从快照原理到高效版本控制实践
  • VSCode MCP输出阅读器:AI编程工作流的效率倍增器
  • 大模型API成本优化:基于语义缓存与提示压缩的Token节省方案
  • blog作业
  • Blog-1
  • GitHub下载太慢?3分钟学会Fast-GitHub加速插件的终极解决方案
  • 物联网设备开发新范式:Golioth统一固件SDK架构解析与Zephyr实战
  • ViGEmBus:终极Windows游戏控制器模拟解决方案,彻底改变游戏输入体验
  • 开源可观测性平台SigNoz:一体化监控与分布式链路追踪实战
  • 【嵌入式 AI 实战第 9 期】环境感知(一)气体传感器阵列与数据采集(附完整 C 语言驱动)
  • 西门子1200PLC+FactoryIO:手把手教你搭建三层电梯仿真项目(附完整程序与避坑点)
  • Book118文档下载器:三步轻松获取免费PDF的完整指南
  • 体验Taotoken官方价折扣与活动价带来的实际成本节省
  • 西安小程序制作优质服务推荐
  • 【Tools】从零到一:Typora 1.2.4 极速安装与个性化配置全攻略
  • 为ClaudeCode配置Taotoken作为稳定可靠的API供应商
  • 出口土耳其:关键注意事项与避坑指南
  • 基于Adafruit TRRS Trinkey构建低成本无障碍鼠标键盘模拟器与开关控制器