1、單元測試。單元測試是用來對一個模塊、一個函數或者一個類來進行正確性檢驗的測試工作。Python提供了編寫和運行單元測試用例的機制。
(2)編寫單元測試時,我們需要編寫一個測試類,從unittest.TestCase繼承。
(3)以test開頭的方法就是測試方法,不以test開頭的方法不被認爲是測試方法,測試的時候不會被執行。對每一類測試都需要編寫一個test_xxx()方法。
(4)由於unittest.TestCase提供了很多內置的條件判斷,我們只需要調用這些方法就可以斷言輸出是否是我們所期望的。常用的斷言包括:
assertEquals(表達式1,表達式2):如果表達式1=表達式2,則測試通過,否則拋出異常。
with assertRaises(錯誤類型):
...
如果執行...部分代碼時能拋出指定的錯誤類型則測試通過,否則拋出異常。
(5)一旦編寫好單元測試,我們就可以運行單元測試。最簡單的運行方式是測試代碼的最後加上兩行代碼:
if __name__ == '__main__':
unittest.main()
另一種更常見的方法是在命令行通過參數-m unittest直接運行單元測試。
(6)此外,可以在單元測試中編寫兩個特殊的setUp()和tearDown()方法。這兩個方法會分別在每調用一個測試方法的前後分別被執行。
#定義一個待測試的類
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編程學起。