原文出处:

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140137128705556022982cfd844b38d050add8565dcb9000

**************************************************************************

如果你听说过“测试驱动开发”(TDD:Test-Driven Development),单元测试就不陌生。

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

比如对函数abs(),我们可以编写出以下几个测试用例:

  1. 输入正数,比如11.20.99,期待返回值与输入相同;

  2. 输入负数,比如-1-1.2-0.99,期待返回值与输入相反;

  3. 输入0,期待返回0

  4. 输入非数值类型,比如None[]{},期待抛出TypeError

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

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

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

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

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

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

mydict.py代码如下:

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

为了编写单元测试,我们需要引入Python自带的unittest模块,编写mydict_test.py如下:

import unittestfrom mydict import Dictclass TestDict(unittest.TestCase):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

编写单元测试时,我们需要编写一个测试类,从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

运行单元测试

一旦编写好单元测试,我们就可以运行单元测试。最简单的运行方式是在mydict_test.py的最后加上两行代码:

if __name__ == '__main__':unittest.main()

这样就可以把mydict_test.py当做正常的python脚本运行:

$ python mydict_test.py

另一种更常见的方法是在命令行通过参数-m unittest直接运行单元测试:

$ python -m unittest mydict_test
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000sOK

这是推荐的做法,因为这样可以一次批量运行很多单元测试,并且,有很多工具可以自动来运行这些单元测试。

setUp与tearDown

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

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

class TestDict(unittest.TestCase):def setUp(self):print 'setUp...'def tearDown(self):print 'tearDown...'

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

小结

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

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

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

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

python---单元测试相关推荐

  1. Python单元测试--使用装饰器实现测试跳过和预期故障

    Python单元测试unittest中提供了一下四种装饰器实现测试跳过和预期故障.(使用Python 2.7.13) 请查考Python手册中: https://docs.python.org/dev ...

  2. Python单元测试去哪儿了?

    如果您正在编写库或应用程序,则单元测试文件会放在哪里? 将测试文件与主应用程序代码分开是很好的选择,但是将它们放在应用程序根目录内的" tests"子目录中是很尴尬的,因为这样会使 ...

  3. Python单元测试框架Pyunit 的使用

    Python单元测试框架Pyunit 使用示例: 1 import unittest 2 3 class Person: 4 def age(self): 5 return 34 6 def name ...

  4. Python单元测试框架之pytest 3 -- fixtures

    From: https://www.cnblogs.com/fnng/p/4769020.html Python单元测试框架之pytest -- fixtures 2015-08-29 13:05 b ...

  5. Python单元测试最佳实践

    Are you ready? ↓↓↓ 今天的课程为< Python单元测试>,内容共分为三个部分:单元测试的概念.工具与方法.Coverage 统计单元测试覆盖率的工具和Mock 简化单元 ...

  6. python单元测试工具_Python的单元测试工具——unittest小结

    简介 unittest是Python的内建模块,是Python单元测试的事实标准,也叫PyUnit.使用unittest之前,先了解如下几个概念: test case:测试用例,可以通过创建unite ...

  7. Python 单元测试详解

    作者:yukkizhang,腾讯 CSIG 测试工程师 本文直接从常用的 Python 单元测试框架出发,分别对几种框架进行了简单的介绍和小结,然后介绍了 Mock 的框架,以及测试报告生成方式,并以 ...

  8. python单元测试mock_Python单元测试的Mock是怎么回事

    单元测试 什么是单元测试, 维基百科上是这么定义的: unit testing is a method by which individual units of source code, sets o ...

  9. python单元测试示范卷_Python单元测试--Unittest

    原标题:Python单元测试--Unittest 什么是单元测试 单元测试是用来对最小可测试单元(如一个函数.一个类或者一个模块)进行检查和验证.尤其是在对代码进行修改或重构后,可以快速准确的定位出现 ...

  10. python单元测试_python单元测试

    http://pyunit.sourceforge.net/ 目录 Python 单元测试框架 .................................................... ...

最新文章

  1. Linux下ibus-sunpinyin的安装及翻页快捷键设置!
  2. soa学习路线_Web服务安全性和SOA路线图的人为维度
  3. 【C++ STL学习之一】容器的共通能力和共通操作总结
  4. 控制台修改应用端口_应用架构六边型架构:三个原则和一个实现示例
  5. Cache和DMA一致性 iCache和dCache一致性
  6. 硬盘的老化测试软件,固态硬盘不耐用?教你检测固态硬盘还能用多久
  7. 《鸟哥Linux私房菜》系列
  8. EDA课程设计(设计一个4时隙的时分复用模块)
  9. android教务系统框架,基于android的面向学生的移动教务管理系统设计与实现
  10. 想做出高级又好看的PPT,这9个技巧你别错过
  11. YOLOv5(Windows)使用教程
  12. 凸包算法(Graham扫描法)
  13. Opencv去除高光
  14. css flew 布局 解决父元素高度不固定,子级居中。
  15. SQL insert into 插入的单行,多行的情况
  16. linux网络与防火墙
  17. Cadence orcad 设置原理图图纸大小
  18. ehcache 缓存丢失_求助,EhCache缓存中数据失效的问题!
  19. Web.config中设置网站起始页
  20. 管理经济学知识点汇总

热门文章

  1. 特殊用途的IP地址介绍
  2. 有意思的《致招商银行的公开信》行动!
  3. Python适合初学者入门
  4. matlab已知xyz拟合标定map,matlab练习题
  5. java 工程路径_java 项目的路径详情
  6. linux scp ssh拷贝文件,linux-远程拷贝文件之scp
  7. java开闭原则实现代码_向对象的六大原则
  8. HALCON 21.11:深度学习笔记---对象检测, 实例分割(11)
  9. ADC采样间隔问题+TRGO作为ADC的触发源头
  10. jfinal后台获取权限树,以供前台展示