单元测试

单元测试是用来对一个模块、一个函数或者一个类进行正确性检验的测试工作

比如对Python中的abs 的测试

输入正数: 比如 1, 2, 3, 返回值不变

输入负数: 比如 -1, -2, -3, 返回值是本身取反

输入0: 比如 0, 返回值0

把上面的测试用例放到一个测试模块里,就是一个完整的单元测试。

如果单元测试通过,说明我们测试的这个函数能够正常工作。如果单元测试不通过,要么函数有bug,要么测试条件输入不正确,总之,需要修复使单元测试能够通过。

单元测试通过后有什么意义呢?如果我们对abs()函数代码做了修改,只需要再跑一遍单元测试,如果通过,说明我们的修改不会对abs()函数原有的行为造成影响,如果测试不通过,说明我们的修改与原有行为不一致,要么修改代码,要么修改测试。

这种以测试为驱动的开发模式最大的好处就是确保一个程序模块的行为符合我们设计的测试用例。在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的。

我们来编写一个Dict类,这个类的行为和dict一致,但是可以通过属性来访问,用起来就像下面这样:

>>> d = Dict(a=1, b=2)
>>> d['a']
1
>>> d.a
1

Dict 类的具体实现:

 class Dict(dict):
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):
self[key] = value

unittest.TestCase

编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。

以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。

对每一类测试都需要编写一个test_xxx()方法。由于unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。最常用的断言就是assertEquals():

 self.assertEquals(abs(-1), 1) # 断言函数返回的结果与1相等

另一种重要的断言就是期待抛出指定类型的Error,比如通过d['empty']访问不存在的key时,断言会抛出KeyError:

 with self.assertRaises(KeyError):
value = d['empty']

而通过d.empty访问不存在的key时,我们期待抛出AttributeError:

 with self.assertRaises(AttributeError):
value = d.empty

setUp与tearDown 可以在单元测试中编写两个特殊的setUp()和tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。

setUp()和tearDown()方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码:

 class TestDict(unittest.TestCase):

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

可以再次运行测试看看每个测试方法调用前后是否会打印出setUp...和tearDown...。

测试类的具体实现:

 import unittest
from Dict import Dict class TestDict(unittest.TestCase): def setUp(self):
print 'setUp...' def tearDown(self):
print 'tearDown...' def test_init(self):
d = Dict(a=1, b='test')
self.assertEquals(d.a, 1)
self.assertEquals(d.b, 'test')
self.assertTrue(isinstance(d, dict)) def test_key(self):
d = Dict()
d['key'] = 'value'
self.assertEquals(d.key, 'value') def test_attr(self):
d = Dict()
d.key = 'value'
self.assertTrue('key' in d)
self.assertEquals(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 if __name__ == '__main__':
unittest.main()

注意:

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

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

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

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

版权所有,文章来源:http://www.cnblogs.com/sagecheng/p/5969070.html 

个人能力有限,本文内容仅供学习、探讨,欢迎指正、交流。

参考资料:

python 基础教程:http://www.runoob.com/python/python-tutorial.html

 

最新文章

  1. 添加Silverlight应用到HTML
  2. 微信web开发者工具
  3. SMON: Parallel transaction recovery tried 引发的问题--转载
  4. 用Backbone.js教程系列的链接
  5. ZOJ3201 Tree of Tree(树形DP)
  6. Grand Central Dispatch (GCD)
  7. Oracle存储过程学习使用
  8. c语言通过时间种子产生随机数并选出最大值以及下标
  9. IT痴汉的工作现状18-思维定式
  10. java数据结构系列——排列(2):有序阵列
  11. windows环境Caffe安装配置步骤(无GPU)及mnist训练
  12. iis7 绑定多个ssl证书
  13. ES6 系列之我们来聊聊装饰器
  14. Unreal Engine 4 C++ UCLASS构造函数易出错分析
  15. 后端python基础
  16. HDFS文件系统的JAVA-API操作(一)
  17. AI入门课程资源
  18. Python27中Json对中文的处理
  19. socket网络编程【python】
  20. linux 内存计算

热门文章

  1. 6 week work 2
  2. day_6深浅拷贝,元组字典集合类型定义和各种操作方法
  3. Oracle数据库用EF操作的示例
  4. 几分钟几张图教你学会如何使用UML
  5. 【翻译】Neural Collaborative Filtering--神经协同过滤
  6. [Postman]响应(7)
  7. rabbitmq在ios中实战采坑
  8. jQuery文档操作
  9. Powermock2.0.0 详细 总结
  10. 1 分钟教会你用 Spring Boot 发邮件