内容简介:又是和单元测试有关的代码的阅读 :smile:unittest里的概念很简单,几乎和文件组织一致
又是和单元测试有关的代码的阅读 :smile:
unittest 源码以及注释
https://github.com/jiajunhuang/cpython/tree/annotation/Lib/unittest
简单讲解
unittest里的概念很简单,几乎和文件组织一致
tree . ├── case.py ├── __init__.py ├── loader.py ├── __main__.py ├── main.py ├── result.py ├── runner.py ├── signals.py ├── suite.py └── util.py
其中mock和unittest的test被我移除了。
-
case.py
就是我们平时继承的unittest.TestCase
所在处 -
loader.py
加载测试用例 -
result.py
保存结果的基类 -
runner.py
实际跑单测的时候直接加载的TextTestResult
和TextTestRunner
所在地 -
signals.py
处理相关信号 -
suite.py
TestSuite所在地,TestSuite是TestCase的集合
造个小轮子
# coding: utf-8 import importlib import logging class TestCase(object): def __init__(self, name): self.name = name def setup(self): pass def teardown(self): pass class Loader(object): def __init__(self): self.cases = {} def load(self, path): module = importlib.import_module(path) for test_class_name in dir(module): test_class = getattr(module, test_class_name) if ( isinstance(test_class, type) and issubclass(test_class, TestCase) ): self.cases.update({ test_class: self.find_test_method(test_class) or [] }) def find_test_method(self, test_class): test_methods = [] for method in dir(test_class): if method.startswith("test_"): test_methods.append( getattr(test_class, method) ) return test_methods def __iter__(self): for test_class, test_cases in self.cases.items(): yield test_class, test_cases class Runner(object): def __init__(self, path): self.path = path def run(self): loader = Loader() loader.load(self.path) for test_class, test_cases in loader: test_instance = test_class(test_class.__name__) test_instance.setup() try: for test_case in test_cases: test_case(test_instance) except: logging.exception("error occured, skip this method") test_instance.teardown()
用上面的 TestCase
写个测试用例:
from myunittest import TestCase class DemoTestCase(TestCase): def setup(self): print("setup") def teardown(self): print("teardown") def test_normal(self): print("test normal function") def test_exception(self): raise Exception("haha, exception here!")
启动文件:
from myunittest import Runner if __name__ == "__main__": runner = Runner("test_demo") runner.run()
执行结果:
$ python main.py setup ERROR:root:error occured, skip this method Traceback (most recent call last): File "/home/jiajun/Code/tests/myunittest/myunittest.py", line 64, in run test_case(test_instance) File "/home/jiajun/Code/tests/myunittest/test_demo.py", line 15, in test_exception raise Exception("haha, exception here!") Exception: haha, exception here! teardown
以上所述就是小编给大家介绍的《unittest 源代码阅读》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 如何阅读源代码
- 如何阅读一份源代码?(2020 年版)
- 如何阅读Django源代码-上篇(the5fire版)
- 如何阅读Django源代码-上篇(the5fire版)
- 代码审计--源代码审计思路
- 开放源代码库指南
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
UML用户指南
[美] Grady Booch、James Rumbaugh、Ivar Jacobson / 邵维忠、麻志毅、马浩海、刘辉 / 人民邮电出版社 / 2006-6 / 49.00元
《UML用户指南》(第2版)是UML方面最权威的一本著作,三位作者是面向对象方法最早的倡导者,是UML的创始人。本版涵盖了UML 2.0。书中为具体的UML特征提供了参考,描述了一个使用UML进行开发的过程,旨在让读者掌握UML的术语、规则和语言特点,以及如何有效地使用这种语言,知道如何应用UML去解决一些常见的建模问题。《UML用户指南》(第2版)由7个部分组成,而且每章都描述了一个特定UML特......一起来看看 《UML用户指南》 这本书的介绍吧!