python单元测试

作者 新城 日期 2017-08-28
python单元测试

python单元测试

概念:单元测试是对一个模块,一个函数或者一个类来进行正确性的检测的测试工作。

Demo
比如对函数abs()进行测试:
方法:
1.输入正数1,2.2,0.99,期待返回值和输入值的数值相同
2.输入负数-1,-2.2,-0.99期待返回值和输入值相反
3.输入0返回0
4.输入非数值类型,比如None,{},[]返回异常TypeError

模块#mydict.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
d = 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
35
import 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
2
3
4
5
6
7
class TestDict(unittest.TestCase):

def setUp(self):
print('setUp...')

def tearDown(self):
print('tearDown...')

小结

单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。

单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。

单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug。

单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug。