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的強大的功能不僅僅只有這麼多,具體什麼功能,後面一一爲你們寫出來,若是又不足的地方也能夠提出來,安靜進行修改。

 

 

感受安靜寫的對您有幫助的話,能夠點個關注,持續更新。哪裏寫的有問題或者不懂的能夠留言,看到後第一時間回覆

相關文章
相關標籤/搜索