Python单元测试+文档测试

来源:互联网 发布:中国的社交网络有哪些 编辑:程序博客网 时间:2024/06/13 23:14

单元测试:
单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。
编写一个Dict类,这个类的行为和dict一致,但是可以通过属性来访问
mydict.py代码如下:

class Dict(dict):    def __init__(self, **kw):        super().__init__(**kw)    def __getattr__(self, key):        try:            return self[key]        except KeyError:            raise AttributeError(r"'Dict' object has no attribute '%s'" % key)    def __setattr__(self, key, value):        self[key] = value

编写单元测试,我们需要引入Python自带的unittest模块,编写mydict_test.py:

import unittest  #单元测试from mydict import Dictclass TestDict(unittest.TestCase):  #测试类,从unittest.TestCase继承    def setUp(self):   #setUp()和tearDown()方法会分别在每调用一个测试方法的前后分别被执行        print('setUp...')      def tearDown(self):        print('tearDown...')    def test_init(self):            #测试的方法都以test开头        d=Dict(a=1,b='test')        self.assertEqual(d.a,1)        self.assertEqual(d.b,'test')        self.assertTrue(isinstance(d,dict))    def test_key(self):        d=Dict()        d['key']='value'        self.assertEqual(d.key,'value')    def test_attr(self):        d=Dict()        d.key='value'        self.assertTrue('key' in d)        self.assertEqual(d['key'],'value')    def test_keyerroe(self):        d=Dict()        with self.assertRaises(KeyError):  #期待抛出指定类型的Error,比如通过d['empty']访问不存在的key时,断言会抛出KeyError            value=d['empty']    def test_attrerror(self):        d=Dict()        with self.assertRaises(AttributeError):  #通过d.empty访问不存在的key时,我们期待抛出AttributeError            value=d.emptyif __name__=='__main__':    unittest.main()#D:\Python\学习代码>python mydict_test.py#setUp...#tearDown...#.setUp...#tearDown...#.setUp...#tearDown...#.setUp...#tearDown...#.setUp...#tearDown...#.#----------------------------------------------------------------------#Ran 5 tests in 0.019s#OK 

文档测试:
将一部分函数的期望输入和输出写在注释中,Python内置的“文档测试”(doctest)模块可以自动提取注释中的代码并执行测试。doctest严格按照Python交互式命令行的输入和输出来判断测试结果是否正确。只有测试异常的时候,可以用…表示中间一大段烦人的输出。

class Dict(dict):    '''    Simple dict but also support access as x.y style.    >>> d1 = Dict()    >>> d1['x'] = 100    >>> d1.x    100    >>> d1.y = 200    >>> d1['y']    200    >>> d2 = Dict(a=1, b=2, c='3')    >>> d2.c    '3'    >>> d2['empty']    Traceback (most recent call last):        ...    KeyError: 'empty'    >>> d2.empty    Traceback (most recent call last):        ...    AttributeError: 'Dict' object has no attribute 'empty'    '''    def __init__(self,**kw):        super(Dict,self).__init__(**kw)    def __getattr__(self,key):        try:            return self[key]        except KeyError:            raise AttributeError(r"'Dict'object has no attribute '%s'" % key)    def __setattr__(self,key,value):        elf[key]=valueif __name__=='__main__':    import doctest    doctest.testmod()#运行时若没有任何结果,表示程序没有问题

阶乘函数fact(n)的文档测试:

def fact(n):    '''    >>> fact(-1)    Traceback (most recent call last):        ...     ValueError    >>> fact(0.5)    Traceback (most recent call last):        ...     ValueError    >>> fact(3)    6    >>> fact(1)    1    '''    if not isinstance(n,int):        raise ValueError()    if n<1:        raise ValueError()    if n==1:        return 1    return n*fact(n-1)if __name__=='__main__':    import doctest    doctest.testmod()
原创粉丝点击