单元测试反应的是一种以测试为驱动的开发模式,最大的好处就是保证一个程序模块的行为符合我们设计的测试用例,在将来修改的时候,可以极大程度保证该模块行为仍然是正确的。
下面我编写一个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模块,并需要继承unittest.TestCase类,编写mydict_test.py:
import unittest from mydict import Dict class TestDict(unittest.TestCase): def test_init(self): d = Dict(a=1,b = 'test') self.assertEqual(d.a,1) self.assertEqual(d.b,'test') self.assertTrue(isinstance(d,dict)) def test_ket(key): 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_keyerror(self): d = Dict() with self.assertRaises(KeyError): value = d['empty'] def test_attrerror(self): d = Dict() with self.assertRaises(AttributeError): value = d.empty
凡是以test开头的方法都是测试方法,反之不是,测试时候不会执行。其中,unittest.TestCase提供很多内置的条件判断,我们可以调用这些方法断言输出是否是我们所预计的。一般分为两种,一种是assertEqual():断言某两个结果是否一致。一种是assertRaises():断言是否是期待抛出的指定错误类型。
如何运行单元测试呢?
一种是在mydict_test.py文件最后添加2行代码:
if __name__ == '__main__': unittest.main()
这样我们可以直接运行mydict_test.py脚本。
一种是命令行增加参数 -m unittest 直接运行单元测试:
python -m unittest mydict_test
另外,可以通过在单元测试中增加两个特殊函数setUp()和tearDown()函数,已实现在每调用一个测试方法的前后分别执行指定的动作,,其中setUp是在测试函数调用前执行,tearDown是在之后执行:
笑声激发自强,发愤、图强、飞身向上