unittest使用小demo

1.編寫一個Dict的類,這個類的行爲和dict的用法一致,也可以通過屬性來訪問。編寫mydict.py如下:

# -*- coding:utf-8 -*-
class Dict(dict):
    def __init__(self,**kw):
        super(Dict,self).__init__(**kw)
    def __getattr__(self,key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"Dict object has no attribute '%s'" % key)

    def __setattr__(self, key, value):
        self[key]=value

爲了編寫單元測試,我們需要引入Python自帶的unittest模塊,編寫mydict_test.py如下:

# -*- coding:utf-8 -*-
import unittest
from mydict import Dict

class TestDict(unittest.TestCase):
    def test_init(self):
        d=Dict(a=1,b="test")
        self.assertEquals(d.a,1)
        self.assertEquals(d.b,'test')
        self.assertTrue(isinstance(d,dict))

    def test_key(self):
        d=Dict()
        d['key']='value'
        self.assertEquals(d.key,'value')

    def test_attr(self):
        d=Dict()
        d['key']='value'
        self.assertTrue('key' in d)
        self.assertEquals(d['key'],'value')

    def test_keyerror(self):
        d=Dict()
        with self.assertRaises(KeyError):
            value=d['empty']

    def test_attrerror(self):
        d=Dict()
        with self.assertRaises(AttributeError):
            value=d.empty

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

通過調用unittest.main()能夠執行多個測試用例

編寫單元測試時,我們需要編寫一個測試類,從unittest.TestCase繼承。

test開頭的方法就是測試方法,不以test開頭的方法不被認爲是測試方法,測試的時候不會被執行。

對每一類測試都需要編寫一個test_xxx()方法。由於unittest.TestCase提供了很多內置的條件判斷,我們只需要調用這些方法就可以斷言輸出是否是我們所期望的。最常用的斷言就是assertEquals()

self.assertEquals(abs(-1),1)

另一種重要的斷言就是期待拋出指定類型的Error,比如通過d['empty']訪問不存在的key時,斷言會拋出KeyError

with self.assertRaises(KeyError):

           value=d['empty']

而通過d.empty訪問不存在的key時,我們期待拋出AttributeError

with self.assertRaises(AttributeError):

      value=d.empty

setUp與tearDown

可以在單元測試中編寫兩個特殊的setUp()tearDown()方法。這兩個方法會分別在每調用一個測試方法的前後分別被執行。

setUp()tearDown()方法有什麼用呢?設想你的測試需要啓動一個數據庫,這時,就可以在setUp()方法中連接數據庫,在tearDown()方法中關閉數據庫,這樣,不必在每個測試方法中重複相同的代碼:

class TestDict(unittest.TestCase):

    def setUp(self):
        print 'setUp...'

    def tearDown(self):
        print 'tearDown...'



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章