unittest---unittest简单介绍

  提及python的单元测试,第一反应确定就会是unittest,unittest做为python的标准库,很优秀,也被普遍的用到各个项目,可是大家知道吗?python的单元测试并不仅有这一个,还有个pytest。和nose,后面咱们主要经过unittest+python完成咱们的自动化框架html

unittest介绍

unittest单元测试框架最先受到junit(junit是java的单元测试,)的启发,和其余语言的主流单元测试框架有很类似的地方,他支持测试自动化,多个用例共享前置和清理代码,聚合多个测试用例到测试集中,并将测试和报告框架独立java

官方文档:https://docs.python.org/2/library/unittest.htmlpython

unittest方法

一、TestCase(测试用例):全部的测试用例的基类,一个test case 包括正常执行的用例,其中包括setup(用例的开始),tearDown(用例的结束),以及run(用例的执行器)。c++

二、TestSuite(测试套件):多个测试用例的组合就是测试套件,TestSuite能够嵌套TestSuite。框架

三、TestLoder:是用来加载 TestCase到TestSuite中,其中有几个loadTestsFrom_()方法,就是从各个地方寻找TestCase,建立他们的实例,而后add到TestSuite中,再返回一个TestSuite实例函数

四、TextTestRunner:是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
五、TextTestResult:测试结果会保存到TextTestResult实例中,包括运行了多少用例,成功与失败多少等信息;
六、TestFixture:一个测试用例的初始化准备及环境还原,主要是setUp() 和 setDown()方法;单元测试

unittest使用方法

对于一些方法的使用,必需要先看一遍源码,源码上写的很清楚的测试

import unittest

    class IntegerArithmeticTestCase(unittest.TestCase):
        def testAdd(self):  # test method names begin with 'test'  # 测试用例的名称要以test开头
            self.assertEqual((1 + 2), 3)
            self.assertEqual(0 + 1, 1)
        def testMultiply(self):
            self.assertEqual((0 * 10), 0)
            self.assertEqual((5 * 8), 40)

    if __name__ == '__main__':
        unittest.main()

上面的源码中经过继承unittest.TestCase来建立一个测试用例,在这个类中,方法定位都是已test的前缀开头(固然也能够本身进行修改,这个要更改源码,安静后面进行补充),测试框架将它做为独立的测试去执行,每条用例中也都经过assert的方法进行去断言ui

前置和后置

一、setUp:在写测试用例的时候,这个就是执行用例的前置条件。
二、tearDown:执行完用例后,为了避免影响下一次用例的执行,通常有个数据还原的过程,这就是执行用例的后置条件。
三、前置和后置都是非必要的条件,若是没有也能够写pass,也能够不写
五、setUpClass():必须使用@classmethod 装饰器,全部case运行前只运行一次
六、tearDownClass():必须使用@classmethod装饰器,全部case运行完后只运行一次spa

说了这么多,咱们动手试试。

# coding:utf-8
import unittest

class Test(unittest.TestCase):
    def setUp(self):
        print('这是用例的前置')

    def tearDown(self):
        print('这是用例的后置')

    def test01(self):
        print('这是第一条用例')

    def test02(self):
        print('这是第二条用例')

    def test03(self):
        print('这是第三条用例')

if __name__ == '__main__':
    unittest.main()

发现每执行一条用例,先执行的前置条件,而后执行用例内容,最后执行后置的条件。

Ran 3 tests in 0.001s 表示执行了3条用例公用了0.01S的时间

可能咱们遇到一些用例,只须要执行1次前置和后置,那么咱们能够经过添加装饰器进行执行一次前置

装饰器源码:

class classmethod(object):
    """
   classmethod(函数)- >方法
    将函数转换为类方法。
    类方法接收类做为隐式的第一个参数,
  就像实例方法接收实例同样。
  要声明类方法,请使用如下习语:
丙级:
@classmethod
定义f(cls, arg1, arg2,…):
…
它能够在类(例如C.f())上调用,也能够在实例上调用
(例如C () .f ())。除了类以外,实例将被忽略。
若是为派生类调用类方法,则为派生类
对象做为隐含的第一个参数传递。
类方法与c++或Java静态方法不一样。
若是您想要这些,请参阅staticmethod builtin。
    """
    def __get__(self, *args, **kwargs): # real signature unknown
        """ Return an attribute of instance, which is of type owner. """
        pass

    def __init__(self, function): # real signature unknown; restored from __doc__
        pass

    @staticmethod # known case of __new__
    def __new__(*args, **kwargs): # real signature unknown
        """ Create and return a new object.  See help(type) for accurate signature. """
        pass

    __func__ = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    __isabstractmethod__ = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default


    __dict__ = None # (!) real value is ''

代码操做

# coding:utf-8
import unittest

class Test(unittest.TestCase):
@classmethod
def setUpClass(self): print('这是用例的前置')
@classmethod
def tearDownClass(self): print('这是用例的后置') def test01(self): print('这是第一条用例') def test02(self): print('这是第二条用例') def test03(self): print('这是第三条用例') if __name__ == '__main__': unittest.main()

执行结果

发现只执行了一次前置和一次后置。

 

unittest做为python标准库提供的单元测试,使用简单,功能强大,平常测试需求都可以知足,可是unittest的强大的功能不仅仅只有这么多,具体什么功能,后面一一为你们写出来,若是又不足的地方也能够提出来,安静进行修改。

 

 

感受安静写的对您有帮助的话,能够点个关注,持续更新。哪里写的有问题或者不懂的能够留言,看到后第一时间回复

相关文章
相关标签/搜索