robot
最新文章(10)
Mqskit 和其它相關工具
CPython 的 GC 二、三事
寫 Mecurial Extension 是件快樂的事!
Mozilla 台灣辨公室徵人啟事
關於 Apple 的兩項專利
core dump 之前的 frame
怎麼發出 beep 聲?
先承認你要找的是奴才吧!
程式碼要清的多乾淨?
FreeBSD 的 Thread-Local Storage 實作
首頁
新編
最新留言
Entries RSS
重要關鍵字(10)
coding (122)
Python (93)
FreeBSD (71)
WEB (61)
URL (48)
hardware (46)
javascript (36)
Linux (34)
blog (30)
C++ (16)
所有關鍵字
新增 URL
unittest of Python
by thinker
2 Columns
關鍵字:
Python
unittest 是 $Python$ 兮 module,也有人稱呼是 PyUnit。 unittest 其實就是 $Python$ 版本兮 JUnit。 unittest 有幾個主要兮 class,分別是 TestCase、TestSuite 和 TestRunner。 使用者將測試程式寫成 TestCase,再將 TestCase 集合 TestSuite,由 TestRunner 來執行 TestSuite 內兮所有 case,最後得著測驗兮結果。 咱先來看兩個簡單的 TestCase,DefaultWidgetSizeTestCase 檢查 widget 是毋是大小正確,WidgetResizeTestCase 是檢查 resize() 是毋是正確運作?這兩兮 TestCase 攏定義 reunTest(),內面是 $test$ 兮內容。由於,在進行 $test$ 之前,可能需要先設定環境,所以 TestCase 會去執行 setUp() 這個 method。使用者可以將環境設定兮程式碼,寫在 setUp() 內面。因為 DefaultWidgetSizeTestCase 和 WidgetResizeTestCase 攏要做同款兮設定,所以咱透過繼承兮方式,在 SimpleWidgetTestCase 定義設定兮程式碼。 {{{ import unittest class SimpleWidgetTestCase(unittest.TestCase): def setUp(self): self.widget = Widget("The widget") class DefaultWidgetSizeTestCase(SimpleWidgetTestCase): def runTest(self): self.failUnless(self.widget.size() == (50,50), 'incorrect default size') class WidgetResizeTestCase(SimpleWidgetTestCase): def runTest(self): self.widget.resize(100,150) self.failUnless(self.widget.size() == (100,150), 'wrong size after resize') }}} 每一個 TestCase 兮 instance,攏是一個 $test$ case,所以上面寫兩個 TestCase 兮 class,咱要分別為之建立 instance,並分別執行。但是,咱會希望一次就 run 所有兮 $test$ case,unittest 使用 TestSuite 來管理 $test$ case,將所有兮 case 集中成 TestSuite 來執行。下面建立兩個 $test$ case,並用 TestSuite.addTest() 將之加入一個 TestSuite。 {{{ test1 = DefaultWidgetSizeTestCase() test2 = WidgetResizeTestCase() testSuite = unittest.TestSuite() testSuite.addTest(test1) testSuite.addTest(test2) }}} 上面將每一個 $test$ case,攏分開成個別兮 TestCase,造成一寡麻煩。unittest 考慮到這點,也允準將所有兮 case 寫成一個 class。如下面將兩個 $test$ case 分別寫成 testDefaultSize() 和 testResize(): {{{ import unittest class WidgetTestCase(unittest.TestCase): def setUp(self): self.widget = Widget("The widget") def tearDown(self): self.widget.dispose() self.widget = None def testDefaultSize(self): self.failUnless(self.widget.size() == (50,50), 'incorrect default size') def testResize(self): self.widget.resize(100,150) self.failUnless(self.widget.size() == (100,150), 'wrong size after resize') }}} 在建立 instance 時,分別帶入 method 兮名: {{{ test1 = WidgetTestCase("testDefaultSize") test2 = WidgetTestCase("testResize") widgetTestSuite = unittest.TestSuite() widgetTestSuite.addTest(test1) widgetTestSuite.addTest(test2) }}} 將 $test$ case 一個一個加入 TestSuite 也真麻煩,所以 unittest 也提供下面兮方法: {{{ class WidgetTestSuite(unittest.TestSuite): def __init__(self): unittest.TestSuite.__init__(self,map(WidgetTestCase, ("testDefaultSize", "testResize"))) }}} 或是下面兮方法,將將 WidgetTestCase 內,所有以 $test$ 開頭兮 method (如: testDefaultSize),攏當作 $test$ case,直接攏加入一個新兮 TestSuite。 {{{ suite = unittest.makeSuite(WidgetTestCase) }}} TestSuite 也可以加入其它兮 TestSuite,變成 sub-suite。 {{{ suite1 = module1.TheTestSuite() suite2 = module2.TheTestSuite() alltests = unittest.TestSuite((suite1, suite2)) }}} 透過呼叫 TestRunner 來執行 TestCase 或者 TestSuite 內兮 $test$ case。目前 unittest 只提供 TextTestRunner,以後可能會提供 $GUI$介面兮 TestRunner。 {{{ unittest.TextTestRunner(verbosity=2).run(alltests) }}} == Reference == * http://docs.python.org/lib/module-unittest.html * http://docs.python.org/lib/organizing-tests.html
最後更新時間: 2005-05-19 23:26:22 CST |
引用
查詢:
COMMENTS: