Python學習筆記(八)測試

參考資料:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140137128705556022982cfd844b38d050add8565dcb9000
今天學習了Python支持的兩種測試模式:單元測試和文檔測試。

1、單元測試。單元測試是用來對一個模塊、一個函數或者一個類來進行正確性檢驗的測試工作。Python提供了編寫和運行單元測試用例的機制。
       (1)爲了編寫單元測試,我們需要引入Python自帶的unittest模塊。
       (2)編寫單元測試時,我們需要編寫一個測試類,從unittest.TestCase繼承。
      (3)以test開頭的方法就是測試方法,不以test開頭的方法不被認爲是測試方法,測試的時候不會被執行。對每一類測試都需要編寫一個test_xxx()方法。
     (4)由於unittest.TestCase提供了很多內置的條件判斷,我們只需要調用這些方法就可以斷言輸出是否是我們所期望的。常用的斷言包括:
       assertEquals(表達式1,表達式2):如果表達式1=表達式2,則測試通過,否則拋出異常。
       with assertRaises(錯誤類型):
              ...
       如果執行...部分代碼時能拋出指定的錯誤類型則測試通過,否則拋出異常。
       (5)一旦編寫好單元測試,我們就可以運行單元測試。最簡單的運行方式是測試代碼的最後加上兩行代碼:
if __name__ == '__main__':
    unittest.main()
這樣就可以把測試代碼當作正常的Python腳本運行。
       另一種更常見的方法是在命令行通過參數-m unittest直接運行單元測試。
    (6)此外,可以在單元測試中編寫兩個特殊的setUp()和tearDown()方法。這兩個方法會分別在每調用一個測試方法的前後分別被執行。
2、文檔測試。Python支持直接在要測試的代碼註釋中給出測試範例,然後以文檔測試模式運行待測試的代碼。
下面是我的學習代碼:
#定義一個待測試的類
class MyDict(dict):
    '''
    Simple dict but also support access as x.y style.

    >>> d1 = MyDict()
    >>> d1['x'] = 100
    >>> d1.x
    100
    >>> d1.y = 200
    >>> d1['y']
    200
    >>> d2 = MyDict(a=1, b=2, c='3')
    >>> d2.c
    '3'
    >>> d2['empty']
    Traceback (most recent call last):
        ...
    KeyError: 'empty'
    >>> d2.empty
    Traceback (most recent call last):
        ...
    AttributeError: 'MyDict' object has no attribute 'empty'
    '''
    def __init__(self, **kw):
        super(MyDict, self).__init__(**kw)
    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'MyDict' object has no attribute '%s'" % key)
    def __setattr__(self, key, value):
        self[key] = value
#加入下面的代碼後,運行該代碼文件時,即可執行在註釋中給出的測試範例
if __name__ == '__main__':
    #引用文檔測試模塊
    import doctest
    doctest.testmod()
下面的代碼,定義了一個針對MyDict類的單元測試。
import unittest
import time

from day8 import MyDict

class MyDictTest(unittest.TestCase):
    def setUp(self):
        print 'start TestCase at ', time.strftime('%Y-%m-%d %H:%M:%S:%',time.localtime(time.time()))
    def tearDown(self):
        print 'end TestCase at ', time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
    #測試用例1 測試繼承自dict的基本操作
    def test_init(self):
        d = MyDict(a = 1, b = 'test')
        self.assertEquals(d.a, 1)
        self.assertEquals(d.b, 'test')
        self.assertTrue(isinstance(d, dict))
    #測試用例2 測試繼承自dict的屬性用法
    def test_key(self):
        d = MyDict()
        d['key'] = 'value'
        self.assertEquals(d.key, 'value')
    #測試用例3 測試MyDict的屬性用法
    def test_attr(self):
        d = MyDict()
        d.key = 'value'
        self.assertEquals(d['key'], 'value')
    #測試用例4 測試繼承自dict的屬性訪問不存在的情況
    def test_keyerror(self):
        d = MyDict()
        with self.assertRaises(KeyError):
            value = d['empty']
    #測試用例5 測試MyDict的屬性訪問不存在的情況
    def test_attrerror(self):
        d = MyDict()
        with self.assertRaises(AttributeError):
            value = d.empty

if __name__ == '__main__':
    unittest.main()
有點疑問,在上面代碼的setUp和tearDown定義中,怎麼能知道當前執行的是哪個測試用例呢?
今天就學到這裏啦,下一節從IO編程學起。

發佈了80 篇原創文章 · 獲贊 3 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章