利用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基础教程之常用运算符
Aug 29 Python
Python MySQLdb模块连接操作mysql数据库实例
Apr 08 Python
Python基础知识_浅谈用户交互
May 31 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
详解Python_shutil模块
Mar 15 Python
python中如何使用分步式进程计算详解
Mar 22 Python
python实现局域网内实时通信代码
Dec 22 Python
jupyter notebook tensorflow打印device信息实例
Apr 20 Python
Python命名空间及作用域原理实例解析
Aug 12 Python
python 实现定时任务的四种方式
Apr 01 Python
Python装饰器详细介绍
Mar 25 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
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
2011/08/09 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
2010/01/22 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
javascript实现可改变滚动方向的无缝滚动实例
2013/06/17 Javascript
JavaScript生成SQL查询表单的方法
2015/08/13 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
实例讲解JavaScript中instanceof运算符的用法
2016/06/08 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
Json按某个键的值进行排序
2016/12/22 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
微信小程序在其他页面监听globalData中值的变化
2019/07/15 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
Python中的模块和包概念介绍
2015/04/13 Python
深入理解Python中各种方法的运作原理
2015/06/15 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
工程造价专业大学生自荐信
2013/10/01 职场文书
法律进社区实施方案
2014/03/21 职场文书
请假条范文大全
2014/04/10 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
节水倡议书
2015/01/19 职场文书
vue3如何优雅的实现移动端登录注册模块
2021/03/29 Vue.js
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB
js面向对象编程OOP及函数式编程FP区别
2022/07/07 Javascript