利用Python中unittest实现简单的单元测试实例详解


Posted in Python onJanuary 09, 2017

前言

单元测试的重要性就不多说了,可恶的是Python中有太多的单元测试框架和工具,什么unittest, testtools, subunit, coverage, testrepository, nose, mox, mock, fixtures, discover,再加上setuptools, distutils等等这些,先不说如何写单元测试,光是怎么运行单元测试就有N多种方法,再因为它是测试而非功能,是很多人没兴趣触及的东西。但是作为一个优秀的程序员,不仅要写好功能代码,写好测试代码一样的彰显你的实力。如此多的框架和工具,很容易让人困惑,困惑的原因是因为并没有理解它的基本原理,如果一些基本的概念都不清楚,怎么能够写出思路清晰的测试代码?

今天的主题就是unittest,作为标准python中的一个模块,是其它框架和工具的基础,参考资料是它的官方文档:http://docs.python.org/2.7/library/unittest.html和源代码,文档已经写的非常好了,本文给出一个实例,很简单,看一下就明白了。

实例如下

首先给出一个要测试的Python模块,代码如下:

待测试的程序:date_service.pyPython

# coding:utf8
'''
日期常用类
 
@author: www.crazyant.net
'''
 
def get_date_year_month(pm_date):
 """获取参数pm_date对应的年份和月份
 """
 if not pm_date:
  raise Exception("get_curr_year_month: pm_date can not be None")
 
 # get date's yyyymmddHHMMSS pattern
 str_date = str(pm_date).replace("-", "").replace(" ", "").replace(":", "")
 
 year = str_date[:4]
 month = str_date[4:6]
 return year, month

然后就可以编写测试脚本,代码如下:

测试程序:test_date_service.pyPython

# coding: utf8
 
"""
测试date_service.py
 
@author: peishuaishuai
"""
 
import unittest
 
from service import date_service
 
class DateServiceTest(unittest.TestCase):
 """
 test clean_tb_async_src_acct.py
 """
 
 def setup(self):
  """在这里做资源的初始化 """
  pass
 
 def tearDown(self):
  """在这里做资源的释放 """
  pass
 
 def test_get_date_year_month_1(self):
  """ 测试方法1,测试方法应该以test_开头 """
  
  pm_date = "2015-11-25 14:40:52"
  year, month = date_service.get_date_year_month(pm_date)
  self.assertEqual(year, "2015", "year not equal")
  self.assertEqual(month, "11", "month not equal")
 
 def test_get_date_year_month_2(self):
  """ 测试方法1,测试方法应该以test_开头 """
  pm_date = "20161225144052"
  year, month = date_service.get_date_year_month(pm_date)
  self.assertEqual(year, "2016", "year not equal")
  self.assertEqual(month, "12", "month not equal")
 
 
# test main
if __name__ == "__main__":
 unittest.main()

运行这个test_date_service.py,就会打印出如下信息:

运行测试结果

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
 
OK

这里的每一个点,就代表运行成功了一个测试,最后会给出运行成功了全部的多少个测试以及测试的时间。

之前的很多时间,我一直不知道写单测有什么用,因为单测只是把写好的程序运行了一遍,并没有创建新的逻辑,我心里在疑惑“我已经将程序按照我的想法写好了,它就会按照我的设计来运行,为什么要用单测重新走一遍呢?”,后来出了一个事情,代码出了BUG,我调试了好久,才发现问题出在”obja.equals(objb)”,因为obja和objb一个是Long一个是Integer,所以即使数值相同,也不会相等。

从那一刻,我发现单测做的事情,其实就是“验证程序是否按照我的想法在运行”,这才是它的终极目的,但是,这却是很关键的事情,设计往往没有错,但是写出来的代码却经常并不是按照我们所想的去运行的。

单测,就是验证代码是不是按照我们想象的在运行,这也是单测这个技术的意义所在。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
Python自动调用IE打开某个网站的方法
Jun 03 Python
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 Python
python监控文件或目录变化
Jun 07 Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
pandas实现to_sql将DataFrame保存到数据库中
Jul 03 Python
python代理工具mitmproxy使用指南
Jul 04 Python
pytorch numpy list类型之间的相互转换实例
Aug 18 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 Python
Numpy将二维数组添加到空数组的实现
Dec 05 Python
python实现ssh及sftp功能(实例代码)
Mar 16 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
Jun 10 Python
pytorch下的unsqueeze和squeeze的用法说明
Feb 06 Python
Python中的sort()方法使用基础教程
Jan 08 #Python
Python守护进程和脚本单例运行详解
Jan 06 #Python
Python 基础知识之字符串处理
Jan 06 #Python
详解Python中的相对导入和绝对导入
Jan 06 #Python
Python中取整的几种方法小结
Jan 06 #Python
Python正则表达式实现截取成对括号的方法
Jan 06 #Python
关于Python元祖,列表,字典,集合的比较
Jan 06 #Python
You might like
YII Framework框架教程之日志用法详解
2016/03/14 PHP
Gird事件机制初级读本
2007/03/10 Javascript
JavaScript继承方式实例
2010/10/29 Javascript
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
js实现非常简单的焦点图切换特效实例
2015/05/07 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
深入理解js数组的sort排序
2016/05/28 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
Array数组对象中的forEach、map、filter及reduce详析
2018/08/02 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
200行python代码实现2048游戏
2019/07/17 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
2019/12/31 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
联想中国官方商城:Lenovo China
2017/10/18 全球购物
社会实践心得体会
2014/01/03 职场文书
总经理文秘岗位职责
2014/02/03 职场文书
税务会计岗位职责
2014/02/18 职场文书
居住证明范文
2015/06/17 职场文书
2015年七夕情人节感言
2015/08/03 职场文书
关于职业道德的心得体会
2016/01/18 职场文书
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android
企业版Windows 11有哪些新功能? Win11适用于企业的功能介绍
2021/11/21 数码科技