python单元测试
概念:单元测试是对一个模块,一个函数或者一个类来进行正确性的检测的测试工作。
Demo
比如对函数abs()进行测试:
方法:
1.输入正数1,2.2,0.99,期待返回值和输入值的数值相同
2.输入负数-1,-2.2,-0.99期待返回值和输入值相反
3.输入0返回0
4.输入非数值类型,比如None,{},[]返回异常TypeError
模块#mydict.py1
2
3
4
5
6
7
8
9
10
11
12
13
14d = Dict(a=1, b=2)
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
测试模块1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35import unittest #引入Python自带的unittest模块
from mydict import Dict
class TestDict(unittest.TestCase): #从unittest.TestCase继承
def test_init(self): #以test开头的方法就是测试方法
d = Dict(a=1, b='test')
self.assertEqual(d.a, 1)
self.assertEqual(d.b, 'test') #assertEqual()断言
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_keyerror(self):
d = Dict()
with self.assertRaises(KeyError): #通过d['empty']访问不存在的key时,断言会抛出KeyError:
value = d['empty']
def test_attrerror(self):
d = Dict()
with self.assertRaises(AttributeError): #通过d.empty访问不存在的key时,我们期待抛出AttributeError
value = d.empty
if __name__ == '__main__': #运行单元测试
unittest.main()
setUp与tearDown
这两个方法会分别在每调用一个测试方法的前后分别被执行
1 | class TestDict(unittest.TestCase): |
小结
单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。
单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。
单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug。
单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug。