zoukankan      html  css  js  c++  java
  • python unittest框架中addCleanup函数详解

    接上一篇doCleanups说明,这次介绍下另一个很好用的函数:addCleanup

    还是老规矩,看官方文档说明:

    addCleanup(function, *args, **kwargs)¶
    Add a function to be called after tearDown() to cleanup resources used during the test. Functions will be called in reverse order to the order they are added (LIFO). They are called with any arguments and keyword arguments passed into addCleanup() when they are added.
    
    If setUp() fails, meaning that tearDown() is not called, then any cleanup functions added will still be called.
    
    New in version 2.7.

    中文解释一下:

    添加针对每个测试用例执行完tearDown()方法之后的清理方法,添加进去的函数按照后进先出(LIFO)的顺序执行,要加参数进去
    当然,如果setUp()方法执行失败,那么不会执行tearDown()方法,但是会执行addCleanup()里添加的函数。

    那其实在实际使用时,也不会写多个函数进去。

    那么,应用场景是怎么样的呢?

    场景是这样的:正常的测试用例是这样的,你创建资源后,需要在用例中去进行删除资源,或者要在tearDown中进行资源清理,相当不方便,用addCleanup后,直接在用例中写入函数,在tearDown用例后,会再次调用addCleanup来删除资源,减少代码量及遗漏删除

    看看一个简单实例吧

    #coding:utf-8
    '''
    Created on 2016年8月31日
    @author: huzq
    '''
    import unittest
    
    class my(unittest.TestCase):
        
        def delf(self,a):
            print a
        
        def setUp(self):
            print "setUp"
    
            
        def test_1(self):
            '''i dont konw'''
            a='1111'
            print "test_1"       
            cleanups = ('bbbbb',)
            self.addCleanup(self.delf,
                            cleanups [0])
            
        def tearDown(self):
            print 'this is tearDown'
            
        #def doCleanups(self):
         #   print "this is cleanups"
        
        def test_2(self):
            print "test_2"
        
        @classmethod
        def tearDownClass(cls):
            print "teardown...."
            
    if __name__=="__main__":
        test=unittest.TestSuite()
        test.addTest(my('test_1'))
        test.addTest(my('test_2'))
        runner=unittest.TextTestRunner()
        runner.run(test)

    运行结果如下:

    ..
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s
    
    OK
    setUp
    test_1
    this is tearDown
    bbbbb
    setUp
    test_2
    this is tearDown
    teardown....

    看看红色部分,就是addCleanup的功效

    后进先出的体现就是测试用例中使用了多个addCleanup时,在teardown之后执行顺序是后进先出的顺序,如下一个用例:

    def test_1(self):
            '''i dont konw'''
            a='1111'
            print "test_1"  
            #self.addCleanup(self.delf,a)
            
            cleanups = ('bbbbb',)
            self.addCleanup(self.delf,
                            cleanups[0])
            print "2222"
            self.addCleanup(self.delf,
                            a)

    测试结果是如下的:

    test_1
    2222
    this is tearDown
    1111
    bbbbb

    先执行了最后一个addCleanup,再执行倒数第二个addCleanup

     如果你又加了doCleanups的话,只会执行doCleaups,不执行addCleanup

    笔者有幸看到很多老外开源的框架,在代码中大量使用的addCleanup函数。大家可以借鉴

  • 相关阅读:
    NuGet打包推送批处理以及MSBuild(通用版)
    Linux su和sudo命令的区别,并获得root权限
    linux下命令运行目录上程序前面要加./
    java的系统时间,怎么计算从现在到凌晨还剩下多少时间?
    静态资源压缩(GZIP) 专题
    架构选型之Nodejs与Java
    基于 WebRTC 创建一款多人联机游戏
    django从0到1搭建网站
    Android 关于ExpandableListView去掉里头的分割线
    Android 关于ExpandableListView刷新的解决办法
  • 原文地址:https://www.cnblogs.com/landhu/p/7345181.html
Copyright © 2011-2022 走看看