原创: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

posted @ 2020-08-14 17:16  峡谷恶霸  阅读(375)  评论(0编辑  收藏  举报