轉帖|其它|編輯:郝浩|2010-09-03 16:21:36.000|閱讀 773 次
概述:使用單元測試可以給我們開發人員在實際程序開發中帶來非常大的好處。在這里我們就可以通過本文介紹的關于Python單元測試的相關內容來對這一方面的知識有一個相應的了解。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
測試是一個貫穿于整個開發過程的連續過程,從某個意義上說,軟件開發的過程實際上就是測試過程。正如Martin Fowler所說的,“在你不知道如何測試代碼之前,就不該編寫程序。而一旦你完成了程序,測試代碼也應該完成。除非測試成功,你不能認為你編寫出了可以工作的程序。”
測試最基本的原理就是比較預期結果是否與實際執行結果相同,如果相同則測試成功,否則測試失敗。為了更好地理解PyUnit這一自動測試框架的作用,先來看一個簡單的例子,假設我們要對例1中的Widget類進行測試:
例1. widget.py
# 將要被測試的類
class Widget:
def __init__(self, size = (40, 40)):
self._size = size
def getSize(self):
return self._size
def resize(self, width, height):
if width 0 or height < 0:
raise ValueError, "illegal size"
self._size = (width, height)
def dispose(self):
pass
采用手工方式進行Python單元測試的Python程序員很可能會寫出類似例2的測試代碼來,
例2. manual.py
from widget import Widget
# 執行測試的類
class TestWidget:
def testSize(self):
expectedSize = (40, 40);
widget = Widget()
if widget.getSize() == expectedSize:
print "test [Widget]: getSize works perfected!"
else:
print "test [Widget]: getSize doesn't work!"
# 測試
if __name__ == '__main__':
myTest = TestWidget()
myTest.testSize()
稍一留心你不難發現這種手工測試方法存在許多問題。首先,測試程序的寫法沒有一定的規范可以遵循,十個程序員完全可能寫出十種不同的測試程序來,如果每個 Python程序員都有自己不同的設計測試類的方法,光維護被測試的類就夠麻煩了,誰還顧得上維護測試類。其次,需要編寫大量的輔助代碼才能進行單元測試,例1中用于測試的代碼甚至比被測試的代碼還要多,而這毫無疑問將增大Python程序員的工作量。
為了讓單元測試代碼能夠被測試和維護人員更容易地理解,最好的解決辦法是讓開發人員遵循一定的規范來編寫用于測試的代碼,具體到Python程序員來講,則是要采用 PyUnit這一自動測試框架來構造單元測試用例。目前PyUnit已經得到了大多數Python開發人員的認可,成了事實上的Python單元測試標準。如果采用 PyUnit來進行同樣的測試,則測試代碼將如例3所示:
例3. auto.py
from widget import Widget
import unittest
# 執行測試的類
class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget()
def tearDown(self):
self.widget = None
def testSize(self):
self.assertEqual(self.widget.getSize(), (40, 40))
# 構造測試集
def suite():
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase("testSize"))
return suite
# 測試
if __name__ == "__main__":
unittest.main(defaultTest = 'suite')
在采用Python單元測試框架后,用于測試的代碼做了相應的改動:
◆用import語句引入unittest模塊。
◆讓所有執行測試的類都繼承于TestCase類,可以將TestCase看成是對特定類進行測試的方法的集合。
◆在setUp()方法中進行測試前的初始化工作,并在tearDown()方法中執行測試后的清除工作,setUp()和tearDown()都是TestCase類中定義的方法。
◆在testSize()中調用assertEqual()方法,對Widget類中getSize()方法的返回值和預期值進行比較,確保兩者是相等的,assertEqual()也是TestCase類中定義的方法。
◆提供名為suite()的全局方法,PyUnit在執行測試的過程調用suit()方法來確定有多少個測試用例需要被執行,可以將TestSuite看成是包含所有測試用例的一個容器。
雖然看起來有點復雜,但PyUnit使得所有的Python程序員都可以使用同樣的Python單元測試方法,測試過程不再是雜亂無章的了,而是在同一規范指導下進行的有序行為,這就是使用PyUnit這一自動單元測試框架所帶來的最大好處。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載