所谓的单元测试,就是对一个模块,一个函数,或则是一个类进行正确性检测的一类测试工作。
以测试驱动的开发方式叫做测试驱动开发(Test Drived Development). 这种开发模式不仅仅是测试,而是分解需求,保证代码质量的一种手段。
单元测试不仅仅在测试的时候保障函数、模块或者类的功能符合我们的需求。同时,也有利于我们在未来修改类或者函数的时候,只需要再跑一遍单元测试就可以确保我们的修改对功能不会产生影响。
当然,单元测试也会让代码量大大增加。
编写单元测试代码需要引入Python的unittest包。
我们可以新建一个单元测试类,但是这个类需要继承unitest.TestCase类。
测试类中的测试方法必须是test开头的,否则不会被执行。
那么这样我们就可以使用unitest.TestCase中的方法了。
常用的方法有:
assertEqual(self, first, second) # 判断是否是预期值
assertTrue(bool) # 判断是否为真
assertRaises(exception) #判断是非抛出特定异常。
我们来举一个例子:
我们先定义一个类自定义类,然后对它进行单元测试。
Dict.py
class Dict(dict):
def __init__(self, **kwargs):
super(Dict, self).__init__(**kwargs)
def __getattr__(self, item):
try:
return self[item]
except KeyError:
raise AttributeError
def __setattr__(self, key, value):
self[key] = value
import unittest
from Dict import Dict
class DictTest(unittest.TestCase):
def test_init(self):
d = Dict(a=100, b=200)
self.assertEqual(d.a, 100)
self.assertEqual(d.b, 200)
self.assertTrue(isinstance(d, dict))
def test_key(self):
d = Dict()
d['key'] = "300"
self.assertEqual(d["key"], "300")
def test_attar(self):
d = Dict()
d.attar = "attar"
self.assertTrue("attar" in d)
self.assertEqual(d.attar, "attar")
def test_keyError(self):
d = Dict()
with self.assertRaises(KeyError):
value = d["NotExisted"]
def test_attarError(self):
d = Dict()
with self.assertRaises(AttributeError):
value = d.not_existed
if __name__ == '__main__':
unittest.main()
因为我们定义了一个dict的子类,所以我们要对它的key、value进行测试;同时它是一个类,所以我们也需要对它的attribute进行测试。
我们定义的unittest.TestCase子类,需要写上两句:
if __name__ == '__main__':
unittest.main()
我们才能像普通python文件一样执行它。
另外,我们也可以用以下方式执行多个test
python -m unittest DictTest
setUp 和 tearDown函数。
setUp和tearDown函数是两个特殊的函数。
setUp再所有单元测试开始前运行; tearDown函数在所有单元测试运行后运行。
这两个函数的应用场景主要有:
例如在需要连接数据库的情况下,可以在setUp函数中开始连接,在tearDown函数中关闭连接。