zoukankan      html  css  js  c++  java
  • unittest源码简化版本

    '''
    myunittest.py
    '''
    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
    from myunittest import Runner
    
    
    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!")
            
            
    
    if __name__ == "__main__":
        runner = Runner("test_demo")
        runner.run()
    

    测试结果

    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
    
  • 相关阅读:
    数据库操作类
    并查集的使用
    简单的图片识别,源代码
    Sql Server清理缓存代码
    京东商城商品价格获取方法
    【转】 SEO的含义与意义
    隐藏控制台窗口的方法
    MySQL存储过程详解
    常见电商B2C网站购物车的设计
    UML建模之业务处理模型(Business Process Model,BPM)
  • 原文地址:https://www.cnblogs.com/amize/p/13251738.html
Copyright © 2011-2022 走看看