利用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实现向ppt文件里插入新幻灯片页面的方法
Apr 28 Python
简述Python中的进程、线程、协程
Mar 18 Python
Python 使用os.remove删除文件夹时报错的解决方法
Jan 13 Python
python中将函数赋值给变量时需要注意的一些问题
Aug 18 Python
简单了解Django模板的使用
Dec 20 Python
matlab中实现矩阵删除一行或一列的方法
Apr 04 Python
python实现图片识别汽车功能
Nov 30 Python
Python bytes string相互转换过程解析
Mar 05 Python
Python正则表达式如何匹配中文
May 27 Python
opencv 实现特定颜色线条提取与定位操作
Jun 02 Python
python常量折叠基础知识点讲解
Feb 28 Python
Python基本的内置数据类型及使用方法
Apr 13 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
ajax php 实现写入数据库
2009/09/02 PHP
php动态变量定义及使用
2015/06/10 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
11款基于Javascript的文件管理器
2009/10/25 Javascript
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
javascript中创建对象的三种常用方法
2010/12/30 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
JavaScript控制Session操作方法
2013/01/17 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
超简单JS二级、多级联动的简单实例
2014/02/18 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
2015/06/10 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
详解Angular的数据显示优化处理
2016/12/26 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
2018/05/08 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
Vue实现数据请求拦截
2019/10/23 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
[02:24]DOTA2亚洲邀请赛 NAVI战队出场宣传片
2015/02/07 DOTA
约瑟夫问题的Python和C++求解方法
2015/08/20 Python
pandas对指定列进行填充的方法
2018/04/11 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
如何用python免费看美剧
2020/08/11 Python
html5实现滑块功能之type="range"属性
2020/02/18 HTML / CSS
心得体会怎么写
2013/12/30 职场文书
学校四群教育实施方案
2014/06/12 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL
Nginx配置之禁止指定IP访问
2022/05/02 Servers