利用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包的五个简单准则简介
Jun 15 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 Python
python实现一个简单的并查集的示例代码
Mar 19 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
Python 读取串口数据,动态绘图的示例
Jul 02 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
Feb 23 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
Apr 21 Python
Python turtle库的画笔控制说明
Jun 28 Python
用python绘制樱花树
Oct 09 Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 Python
pytorch DataLoader的num_workers参数与设置大小详解
May 28 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
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
PHP中数组的三种排序方法分享
2012/05/07 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
php中stdClass的用法分析
2015/02/27 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
PHP简单实现遍历目录下特定文件的方法小结
2017/05/22 PHP
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
javascript中递归的两种写法
2017/01/17 Javascript
JavaScript省市级联下拉菜单实例
2017/02/14 Javascript
jQuery实现搜索页面关键字的功能
2017/02/16 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
vue 动态修改a标签的样式的方法
2018/01/18 Javascript
js中el表达式的使用和非空判断方法
2018/03/28 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
在Python的Django框架中编写错误提示页面
2015/07/22 Python
Python时间模块datetime、time、calendar的使用方法
2016/01/13 Python
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
python3爬取淘宝信息代码分析
2018/02/10 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
python使用html2text库实现从HTML转markdown的方法详解
2020/02/21 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
《这儿真好》教学反思
2014/02/22 职场文书
高中生国庆节演讲稿范文2014
2014/09/21 职场文书
亲属关系公证书样本
2015/01/23 职场文书
股东大会通知
2015/04/24 职场文书
妈妈别哭观后感
2015/06/08 职场文书
python blinker 信号库
2022/05/04 Python