python单元测试unittest实例详解

| 收藏本文 下载本文 作者:一羽

以下是小编整理的python单元测试unittest实例详解(共含5篇),欢迎阅读与收藏。同时,但愿您也能像本文投稿人“一羽”一样,积极向本站投稿分享好文章。

python单元测试unittest实例详解

篇1:python单元测试unittest实例详解

作者:像风一样的自由 字体:[增加 减小] 类型:

单元测试作为任何语言的开发者都应该是必要的,因为时隔数月后再回来调试自己的复杂程序时,其实也是很崩溃的事情。虽然会很快熟悉内容,但是修改和调试将是一件痛苦的事情,如果你在修改了代码后出现问题的话,而单元测试可以帮助我们很快准确的定位到问题的位置,出现问题的模块和单元。所以这是一件很愉快的事情,因为我们知道其它修改或没有修改的地方仍然是正常工作的,而我们目前的唯一问题就是搞定眼前这个有点问题的“家伙”。所以工作会在轻松中开始,并且很快将会结束,因为你已经知道很多信息了。

单元测试自然是对程序中最小的可测试模块--函数来进行测试;因为单元测试的对象是函数,也就是说你得被测试对象一定要有输出结果,哪怕就是异常输出,也得有输出,以便单元测试模块能够捕获返回值,并且与预期值进行比较,从而得出测试通过与否。

单元测试的加载方式有2种:一种是通过unittest.main来启动单元测试的测试模块;一种是添加到testsuite集合中再加载所有的被测试对象,而testsuit里存放的就是单元测试的用例,下面分别列出了2种方法的使用。

1.1 测试模块中的函数:

被测模块:

#!/usr/bin/env python #encoding: utf-8 def sum( x, y): return x+y def sub( x, y): return x-y

单元测试模块:

#!/usr/bin/env python #encoding: utf-8 import unittest import myclass class mytest(unittest.TestCase): ##初始化工作 def setUp(self): pass #退出清理工作 def tearDown(self): pass #具体的测试用例,一定要以test开头 def testsum(self): self.assertEqual(myclass.sum(1, 2), 2, ‘test sum fail‘) def testsub(self): self.assertEqual(myclass.sub(2, 1), 1, ‘test sub fail‘) if __name__ ==‘__main__‘: unittest.main()

测试结果:【F表示一个fail, F前的点表示一个通过,有E的话表示程序自身异常】

.F======================================================================FAIL: testsum (__main__.mytest)----------------------------------------------------------------------Traceback (most recent call last): File “C:UsersxiaowuworkspacemypythonunitTest.py”, line 19, in testsum self.assertEqual(myclass.sum(1, 2), 2, ‘test sum fail‘)AssertionError: test sum fail----------------------------------------------------------------------Ran 2 tests in 0.001s FAILED (failures=1)

1.2 测试模块类中的函数:

被测模块:

#!/usr/bin/env python#encoding: utf-8class myclass: def __init__(self): pass def sum(self, x, y): return x+y def sub(self, x, y): return x-y

单元测试模块:

#!/usr/bin/env python #encoding: utf-8 import unittest import myclass class mytest(unittest.TestCase): ##初始化工作 def setUp(self): self.tclass = myclass.myclass() ##实例化了被测试模块中的类 #退出清理工作 def tearDown(self): pass #具体的测试用例,一定要以test开头 def testsum(self): self.assertEqual(self.tclass.sum(1, 2), 3) if __name__ ==‘__main__‘: unittest.main()

运行结果:

.----------------------------------------------------------------------Ran 1 test in 0.000sOK

这种方式执行单个测试文件时使用-v参数可以获得更多的测试结果信息。如:mytest.py -v

2 加载测试套件

好吧,在运用测试套件进行单元测试之前,我想还是稍微研究一下unittest模块的内容有哪些,其大概的运行方式是什么样的。而后在给出根据各种情况如何制定单元测试套件。

首先,自然是查看unittest模块有哪些成员啦!

>>import unittest >>dir(unittest) [‘FunctionTestCase‘, ‘TestCase‘, ‘TestLoader‘, ‘TestProgram‘, ‘TestResult‘, ‘Tes tSuite‘, ‘TextTestRunner‘, ‘_CmpToKey‘, ‘_TextTestResult‘, ‘_WritelnDecorator‘, ‘__all__‘, ‘__author__‘, ‘__builtins__‘, ‘__doc__‘, ‘__email__‘, ‘__file__‘, ‘__ metaclass__‘, ‘__name__‘, ‘__package__‘, ‘__unittest‘, ‘__version__‘, ‘_makeLoad er‘, ‘_strclass‘, ‘defaultTestLoader‘, ‘findTestCases‘, ‘getTestCaseNames‘, ‘mai n‘, ‘makeSuite‘, ‘os‘, ‘sys‘, ‘time‘, ‘traceback‘, ‘types‘]

可以看到其自身的成员也不是很多,大概包括有:

[‘FunctionTestCase‘, ‘TestCase‘, ‘TestLoader‘, ‘TestProgram‘, ‘TestResult‘, ‘TestSuite‘,‘TextTestRunner‘, ‘_CmpToKey‘, ‘_TextTestResult‘, ‘_WritelnDecorator‘, ‘defaultTestLoader‘,‘findTestCases‘, ‘getTestCaseNames‘, ‘main‘, ‘makeSuite‘]

好吧,我们大概看看具体都是干什么的

>>memblist = [‘FunctionTestCase‘, ‘TestCase‘, ‘TestLoader‘, ‘TestProgram‘, ‘TestResult‘, ‘TestSuite‘,‘TextTestRunner‘, ‘defaultTestLoader‘,‘findTestCases‘, ‘getTestCaseNames‘, ‘main‘, ‘makeSuite‘] >>for memb in memblist: .. cur = getattr(unittest, memb) .. print help(cur)

‘FunctionTestCase‘:函数测试用例,即给一个函数作为参数,返回一个testcase实例,可选参数有set-up,tear-down方法

‘TestCase‘:所有测试用例的基本类,给一个测试方法的名字,返回一个测试用例实例

‘TestLoader‘:测试用例加载器,其包括多个加载测试用例的方法,

返回一个测试套件

loadTestsFromModule(self, module)--根据给定的模块实例来获取测试用例套件

loadTestsFromName(self, name, module=None)

--根据给定的字符串来获取测试用例套件,字符串可以是模块名,测试类名,测试类中的测试方法名,或者一个可调用的是实例对象

这个实例对象返回一个测试用例或一个测试套件

loadTestsFromNames(self, names, module=None) --和上面功能相同,只不过接受的是字符串列表

loadTestsFromTestCase(self, testCaseClass)--根据给定的测试类,获取其中的所有测试方法,并返回一个测试套件

‘TestProgram‘:命令行进行单元测试的调用方法,作用是执行一个测试用例。其实unittest.main()方法执行的就是这个命令,

而这个类实例时默认加载当前执行的作为测试对象,

原型为 __init__(self, module=‘__main__‘, defaultTest=None, argv=None, testRunner=xx, testLoader=xx)

其中module=‘__main__‘就是默认加载自身

‘TestResult‘:测试用例的结果保存实例,通常有测试框架调用

‘TestSuite‘:组织测试用例的实例,支持测试用例的添加和删除,最终将传递给testRunner进行测试执行

‘TextTestRunner‘:进行测试用例执行的实例,其中Text的意思是以文本形式显示测试结果。显示测试名称,即完成的测试结果,其过同执行单元测试脚本时添加-v参数

‘defaultTestLoader‘:其实就是TestLoader

‘findTestCases‘, ‘getTestCaseNames‘:这个2个就不用解释了

‘main‘: 其实就是TestProgram

‘makeSuite‘:通常是由单元测试框架调用的,用于生产testsuite对象的实例

至此,我们知道了。其实整个单元测试框架的逻辑出来了。分三步走:第一步testloader根据传入的参数获得相应的测试用例,即对应具体的测试方法,

然后makesuite在把所有的测试用例组装成testsuite,最后把testsiute传给testrunner进行执行。

而我们通常执行的unittest.main(),其实就是unittest.testprom方法,其执行的功能就是上面分析的三步,在第一步中其传入的参数是自身的模块__main__;

在第二步中把自身模块中的所有测试类中中的测试方法提取出来,并生成测试套件;最后再把测试套件传递给testrunner进行具体的测试。

最后给出一个完整的单元测试组织代码,把该代码放到单元测试用例文件的同一个目录后执行该脚本,即可执行所有的测试用例文件。

【测试用例文件必须为test开头,如:testxxx.py, 当然这个文件本身是一个单元测试的文件】

#!/usr/bin/env python#encoding: utf-8#该代码源自深入pythonimport unittestimport myclassimport reimport osimport sysdef testAllinCurrent(): path = os.path.abspath(os.path.dirname(sys.argv[0])) files = os.listdir(path) test = re.compile(“test.py{1}quot;, re.IGNORECASE) files = filter(test.search, files) filenameToModuleName = lambda f: os.path.splitext(f)[0] moduleNames = map(filenameToModuleName, files) modules = map(__import__, moduleNames) load = unittest.defaultTestLoader.loadTestsFromModule return unittest.TestSuite(map(load, modules))if __name__ == ”__main__“: unittest.main(defaultTest=”regressionTest“)

希望本文所述对大家的Python程序设计有所帮助。

篇2:Python多进程机制实例详解

作者:tianmo 字体:[增加 减小] 类型:转载

这篇文章主要介绍了Python多进程机制,以实例形式详细分析了Python多进程机制的原理与实现技巧,需要的朋友可以参考下

本文实例讲述了Python多进程机制,分享给大家供大家参考。具体如下:

在以前只是接触过PYTHON的多线程机制,今天搜了一下多进程,相关文章好像不是特别多。看了几篇,小试了一把。程序如下,主要内容就是通过PRODUCER读一个本地文件,一行一行的放到队列中去。然后会有相应的WORKER从队列中取出这些行。

import multiprocessingimport osimport sysimport Queueimport timedef writeQ(q,obj): q.put(obj,True,None) print ”put size: “,q.qsize()def readQ(q): ret = q.get(True,1) print ”get size: “,q.qsize() return retdef producer(q): time.sleep(5) #让进行休息几秒 方便ps命令看到相关内容 pid = os.getpid() handle_file = ‘/home/dwapp/joe.wangh/test/multiprocess/datafile‘ with open(handle_file,‘r‘) as f: #with...as... 这个用法今天也是第一次看到的 for line in f:print ”producer <“ ,pid , ”> is doing: “,linewriteQ(q,line.strip()) q.close()def worker(q): time.sleep(5) #让进行休息几秒 方便ps命令看到相关内容 pid = os.getpid() empty_count = 0 while True: try:task = readQ(q)print ”worker <“ , pid , ”> is doing: “ ,task‘‘‘如果这里不休眠的话 一般情况下所有行都会被同一个子进程读取到 为了使实验效果更加清楚 在这里让每个进程读取完一行内容时候休眠5s 这样就可以让其他的进程到队列中进行读取‘‘‘time.sleep(5) except Queue.Empty:empty_count += 1if empty_count == 3: print ”queue is empty, quit“ q.close() sys.exit(0)def main(): concurrence = 3 q = multiprocessing.Queue(10) funcs = [producer , worker] for i in range(concurrence-1): funcs.append(worker) for item in funcs: print str(item) nfuncs = range( len(funcs) ) processes = [] for i in nfuncs: p = multiprocessing.Process(target=funcs[i] , args=(q,)) processes.append(p) print ”concurrence worker is : “,concurrence,” working start“ for i in nfuncs: processes[i].start() for i in nfuncs: processes[i].join() print ”all DONE“if __name__ == ‘__main__‘: main()

实验结果如下:

dwapp@pttest1:/home/dwapp/joe.wangh/test/multiprocess>python 1.py concurrence worker is : 3 working startproducer < 28320 > is doing: line 1put size: 1producer < 28320 > is doing: line 2put size: 2producer < 28320 > is doing: line 3put size: 3producer < 28320 > is doing: line 4put size: 3producer < 28320 > is doing: line 5get size: 3put size: 4worker < 28321 > is doing: line 1get size: 3worker < 28322 > is doing: line 2get size: 2worker < 28323 > is doing: line 3get size: 1worker < 28321 > is doing: line 4get size: 0worker < 28322 > is doing: line 5queue is empty, quitqueue is empty, quitqueue is empty, quitall DONE

程序运行期间在另外一个窗口进行ps命令 可以观测到一些进程的信息

dwapp@pttest1:/home/dwapp/joe.wangh/test/multiprocess>ps -ef | grep pythondwapp 13735 11830 0 Nov20 pts/12 00:00:05 pythondwapp 28319 27481 8 14:04 pts/0 00:00:00 python 1.pydwapp 28320 28319 0 14:04 pts/0 00:00:00 python 1.pydwapp 28321 28319 0 14:04 pts/0 00:00:00 python 1.pydwapp 28322 28319 0 14:04 pts/0 00:00:00 python 1.pydwapp 28323 28319 0 14:04 pts/0 00:00:00 python 1.pydwapp 28325 27849 0 14:04 pts/13 00:00:00 grep pythondwapp@pttest1:/home/dwapp/joe.wangh/test/multiprocess>ps -ef | grep pythondwapp 13735 11830 0 Nov20 pts/12 00:00:05 python #此时28320进程 也就是PRODUCER进程已经结束dwapp 28319 27481 1 14:04 pts/0 00:00:00 python 1.pydwapp 28321 28319 0 14:04 pts/0 00:00:00 python 1.pydwapp 28322 28319 0 14:04 pts/0 00:00:00 python 1.pydwapp 28323 28319 0 14:04 pts/0 00:00:00 python 1.pydwapp 28328 27849 0 14:04 pts/13 00:00:00 grep pythondwapp@pttest1:/home/dwapp/joe.wangh/test/multiprocess>ps -ef | grep pythondwapp 13735 11830 0 Nov20 pts/12 00:00:05 pythondwapp 28319 27481 0 14:04 pts/0 00:00:00 python 1.pydwapp 28321 28319 0 14:04 pts/0 00:00:00 python 1.pydwapp 28322 28319 0 14:04 pts/0 00:00:00 python 1.pydwapp 28323 28319 0 14:04 pts/0 00:00:00 [python] #这里应该是代表28323进程(WORKER)已经运行结束了dwapp 28331 27849 0 14:04 pts/13 00:00:00 grep pythondwapp@pttest1:/home/dwapp/joe.wangh/test/multiprocess>ps -ef | grep pythondwapp 13735 11830 0 Nov20 pts/12 00:00:05 pythondwapp 28337 27849 0 14:05 pts/13 00:00:00 grep python

希望本文所述对大家的Python程序设计有所帮助,

篇3:Python 文件读写操作实例详解

最近更 新

Python列表推导式的使用方法

python设置windows桌面壁纸的实现代码

python 获取文件列表(或是目录例表)

Python开发的单词频率统计工具wordsworth

Python ORM框架SQLAlchemy学习笔记之安装

Python使用urllib2获取网络资源实例讲解

复制粘贴功能的Python程序

Python urllib模块urlopen与urlretriev

python Django模板的使用方法(图文)

python生成指定尺寸缩略图的示例

热 点 排 行

Python入门教程 超详细1小时学会

python 中文乱码问题深入分析

比较详细Python正则表达式操作指

Python字符串的encode与decode研

Python open读写文件实现脚本

Python enumerate遍历数组示例应

Python 深入理解yield

Python+Django在windows下的开发

python 文件和路径操作函数小结

python 字符串split的用法分享

篇4:Python回调函数用法实例详解

作者:tianmo 字体:[增加 减小] 类型:

这篇文章主要介绍了Python回调函数用法,以实例形式较为详细的分析了Python回调函数的定义、功能及相关使用技巧,需要的朋友可以参考下

本文实例讲述了Python回调函数用法,分享给大家供大家参考。具体分析如下:

一、百度百科上对回调函数的解释:

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

二、什么是回调:

软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础,因此,下面我们着重讨论回调机制在不同软件架构中的实现。

三、一个小例子:

#call.py import called def callback(): print ”in callback“ def main(): #called.test() called.test_call(callback) print ”in call.py“ main() #called.py ‘‘‘‘‘ def test(): print ”in called.py test()“ ‘‘‘ def test_call(p_call): print ”in called.py test_call()“ p_call() joe@joe:~/test/python$ python call.py in called.py test_call() in callback in call.py joe@joe:~/test/python$

网上搜到的一个面向对象实现的例子:

当你要加入回调(Callback)功能的时候,代码往往会偏重于回调的实现而不是问题本身了。一个解决方法就是实现一个通用的基础类来解决回调的需求,然后再来实现你为某个事件(Event)所绑定(Binding)的方法(Method)。

代码如下:

class CallbackBase: def __init__(self): self.__callbackMap = {} for k in (getattr(self, x) for x in dir(self)): if hasattr(k, ”bind_to_event“): self.__callbackMap.setdefault(k.bind_to_event, []).append(k) elif hasattr(k, ”bind_to_event_list“): for j in k.bind_to_event_list: self.__callbackMap.setdefault(j, []).append(k) ## staticmethod is only used to create a namespace @staticmethod def callback(event): def f(g, ev = event): g.bind_to_event = ev return g return f @staticmethod def callbacklist(eventlist): def f(g, evl = eventlist): g.bind_to_event_list = evl return g return f def dispatch(self, event): l = self.__callbackMap[event] f = lambda *args, **kargs: map(lambda x: x(*args, **kargs), l) return f ## Sample class MyClass(CallbackBase): EVENT1 = 1 EVENT2 = 2 @CallbackBase.callback(EVENT1) def handler1(self, param = None): print ”handler1 with param: %s“ % str(param) return None @CallbackBase.callbacklist([EVENT1, EVENT2]) def handler2(self, param = None): print ”handler2 with param: %s“ % str(param) return None def run(self, event, param = None): self.dispatch(event)(param) if __name__ == ”__main__": a = MyClass() a.run(MyClass.EVENT1, ‘mandarina‘) a.run(MyClass.EVENT2, ‘naranja‘)

这里有一个类,它有两个事件(EVENT1和EVENT2)和两个处理函数(handler),

第一个处理函数handler1注册了EVENT1,而第二个处理函数handler2当EVENT1或者EVENT2发生的时候都会执行(即注册了全部的事件)。

运行函数(run)在MyClass的主循环中,它会将对应的事件派送(dispatch)出去。这(这里指dispatch函数)会返回一个函数,我们可以把所有需要传给这个函数的参数列表传给它。这个函数运行结束会返回一个列表(list),列表中是所有的返回值。

也许,使用Metaclass能够实现的更优雅一些吧。

希望本文所述对大家的Python程序设计有所帮助。

篇5:Python with用法实例

这篇文章主要介绍了Python with用法实例,本文讲解了with语句的几种使用方法和使用场景,需要的朋友可以参考下

python中with可以明显改进代码友好度,比如:

代码如下:

with open(‘a.txt‘) as f:

print f.readlines()

为了我们自己的类也可以使用with, 只要给这个类增加两个函数__enter__, __exit__即可:

代码如下:

>>> class A:

def __enter__(self):

print ‘in enter‘

def __exit__(self, e_t, e_v, t_b):

print ‘in exit‘

>>> with A() as a:

print ‘in with‘

in enter

in with

in exit

另外python库中还有一个模块contextlib,使你不用构造含有__enter__, __exit__的类就可以使用with:

代码如下:

>>> from contextlib import contextmanager

>>> from __future__ import with_statement

>>> @contextmanager

... def context():

...    print ‘entering the zone‘

...    try:

...        yield

...    except Exception, e:

...        print ‘with an error %s‘%e

...        raise e

...    else:

...        print ‘with no error‘

...

>>> with context():

...    print ‘----in context call------‘

...

entering the zone

----in context call------

with no error

使用的最多的就是这个contextmanager, 另外还有一个closing 用处不大

代码如下:

from contextlib import closing

import urllib

with closing(urllib.urlopen(‘www.python.org‘)) as page:

for line in page:

print line

Python实现高效求解素数代码实例

Python实现的几个常用排序算法实例

《与复习》单元测试

单元测试动员会发言稿

Python continue 语句

python教学设计

语文第五单元测试试题

英语单元测试试卷试题

英语初三 6单元测试

Python入门简单操作

python单元测试unittest实例详解(共5篇)

欢迎下载DOC格式的python单元测试unittest实例详解,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档