利用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 相关文章推荐
Django Admin实现上传图片校验功能
Mar 06 Python
Python实现加载及解析properties配置文件的方法
Mar 29 Python
Python中对数组集进行按行打乱shuffle的方法
Nov 08 Python
浅析Python 中几种字符串格式化方法及其比较
Jul 02 Python
python 字典套字典或列表的示例
Dec 16 Python
python实现根据给定坐标点生成多边形mask的例子
Feb 18 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 Python
Python 实现简单的客户端认证
Jul 29 Python
Python Web项目Cherrypy使用方法镜像
Nov 05 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
Jan 06 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 Python
4种非常实用的python内置数据结构
Apr 28 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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
jQuery获取json后使用zy_tmpl生成下拉菜单
2015/03/27 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
2016/09/21 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
2017/02/14 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
bootstrap自定义样式之bootstrap实现侧边导航栏功能
2018/09/10 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python3+PyQt5使用数据库表视图
2018/04/24 Python
matplotlib 纵坐标轴显示数据值的实例
2018/05/25 Python
使用Python来开发微信功能
2018/06/13 Python
在python中用url_for构造URL的方法
2019/07/25 Python
Pytorch Tensor的索引与切片例子
2019/08/18 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
SQL Server面试题
2013/04/04 面试题
运动会通讯稿50字
2014/01/30 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
精彩的英文自荐信
2014/01/30 职场文书
文秘人员工作职责
2014/01/31 职场文书
开服装店计划书
2014/08/15 职场文书
2014年财务科工作总结
2014/11/11 职场文书
贷款承诺书
2015/01/20 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang