如果项目复杂,进行单元测试是保证降低出错率的好方法,Python提供的unittest可以很方便的实现单元测试,从而可以替换掉繁琐杂乱的main函数测试的方法,将测试用例、测试方法进行统一的管理和维护。
本文给出一个实例,很简单,看一下就明白了。
首先给出一个要测试的Python模块,代码如下:
# 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 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
|
然后就可以编写测试脚本,代码如下:
# 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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
# 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
1
2
3
4
5
|
.
.
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
Ran
2
tests
in
0.000s
OK
|
这里的每一个点,就代表运行成功了一个测试,最后会给出运行成功了全部的多少个测试以及测试的时间。
之前的很多时间,我一直不知道写单测有什么用,因为单测只是把写好的程序运行了一遍,并没有创建新的逻辑,我心里在疑惑“我已经将程序按照我的想法写好了,它就会按照我的设计来运行,为什么要用单测重新走一遍呢?”,后来出了一个事情,代码出了BUG,我调试了好久,才发现问题出在”obja.equals(objb)”,因为obja和objb一个是Long一个是Integer,所以即使数值相同,也不会相等。
从那一刻,我发现单测做的事情,其实就是“验证程序是否按照我的想法在运行”,这才是它的终极目的,但是,这却是很关键的事情,设计往往没有错,但是写出来的代码却经常并不是按照我们所想的去运行的。
单测,就是验证代码是不是按照我们想象的在运行,这也是单测这个技术的意义所在。
本文地址:http://www.crazyant.net/1890.html,转载请注明来源。