原创:unittest 源码解析
signals.py:
主要用于ctrl c 的信号处理
"CATCHBREAK = " -c, --catch Catch control-C and display results\n" "
判断需要CATCHBREAK 后调用signal 给 SIGINT 添加处理函数(捕捉SIGINT 并且展示测试报告)
添加的处理函数最后一步是display results
用到了弱引用weakref,可以避免循环引用的问题
经典是在这个文件里注册了个字典,字典里存放着unittest.runner.TextTestResult,这个有stop方法,可以用作展示报告
for result in _results.keys():
result.stop()
总:ctrl-c --- raises KeyboardInterrupt --- display results
备注:removeResult、removeHandler 其实是没有在源码中使用的
__init__.py:
暴露了下模块,
方便引入模块 from unittest import TestResult == from unittest.result import TestResult
# obsolete 淘汰的; 废弃的; 过时的;
# Expose obsolete functions for backwards compatibility
# deprecated 对…表示极不赞成; 强烈反对;
__main__.py:
python -m lib 的时候调用这个文件,当做命令行启动
main = TestProgram
case.py:
TestCase的父类,定义了一堆assert函数
TestCase 有run 方法,接收result 类来实际运行用例
监控运行用例的fixture,监测异常,跳过用例等。
loader.py:
生成有针对性的用例列表
如:loadTestsFromModule
main.py:
解析命令行参数,调用各个模块
最主要的:
self.parseArgs(argv)
self.runTests()
result.py:
处理测试结果,特别是针对有buffer的,有buffer 就是延时打印结果
有利用到StringIO 往内存里写结果
runner.py
运行整个测试用例,也是有run,调用跑套件
suite.py
测试套件,有run ,遍历套件中的套件/case 来运行用例
util.py
一些工具
命令行:
__init__
__main__
main
loadder 加载用例
result 生成result实例,保存信息
runner 用runner.run 跑 loader
suite suite.run 跑用例或suite
case case.run 跑case