unittest---unittest簡單介紹


  說起python的單元測試,第一反應肯定就會是unittest,unittest作為python的標准庫,很優秀,也被廣泛的用到各個項目,但是你們知道嗎?python的單元測試並不只有這一個,還有個pytest。和nose,后面我們主要通過unittest+python完成我們的自動化框架

unittest介紹

unittest單元測試框架最早受到junit(junit是java的單元測試,)的啟發,和其他語言的主流單元測試框架有很相似的地方,他支持測試自動化,多個用例共享前置和清理代碼,聚合多個測試用例到測試集中,並將測試和報告框架獨立

官方文檔:https://docs.python.org/2/library/unittest.html

unittest方法

1、TestCase(測試用例):所有的測試用例的基類,一個test case 包括正常執行的用例,其中包括setup(用例的開始),tearDown(用例的結束),以及run(用例的執行器)。

2、TestSuite(測試套件):多個測試用例的組合就是測試套件,TestSuite可以嵌套TestSuite。

3、TestLoder:是用來加載 TestCase到TestSuite中,其中有幾個loadTestsFrom_()方法,就是從各個地方尋找TestCase,創建他們的實例,然后add到TestSuite中,再返回一個TestSuite實例

4、TextTestRunner:是來執行測試用例的,其中的run(test)會執行TestSuite/TestCase中的run(result)方法。
5、TextTestResult:測試結果會保存到TextTestResult實例中,包括運行了多少用例,成功與失敗多少等信息;
6、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的方法進行去斷言

前置和后置

1、setUp:在寫測試用例的時候,這個就是執行用例的前置條件。
2、tearDown:執行完用例后,為了不影響下一次用例的執行,一般有個數據還原的過程,這就是執行用例的后置條件。
3、前置和后置都是非必要的條件,如果沒有也可以寫pass,也可以不寫
5、setUpClass():必須使用@classmethod 裝飾器,所有case運行前只運行一次
6、tearDownClass():必須使用@classmethod裝飾器,所有case運行完后只運行一次

說了這么多,我們動手試試。

# 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的強大的功能不單單只有這么多,具體什么功能,后面一一為大家寫出來,如果又不足的地方也可以提出來,安靜進行修改。

 

 

感覺安靜寫的對您有幫助的話,可以點個關注,持續更新。哪里寫的有問題或者不懂的可以留言,看到后第一時間回復


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM