2013-03-24 85 views
0

考慮以下來自Kent Beck的書中的Python代碼:Test Driven Development第18章他正在構建單元測試框架。爲什麼run()方法調用兩次來運行測試用例?

class TestCaseTest(TestCase): 
    def testRunning(self): 
     test= WasRun("testMethod") 
     assert(not test.wasRun) 
     test.run() // Here run() is called once 
     assert(test.wasRun) 
    TestCaseTest("testRunning").run()//Here run() is called again 

基類TestCase的實現如下所示:

TestCase 
def __init__(self, name): 
    self.name= name 
def run(self): 
    method = getattr(self, self.name) 
    method() 
  1. 爲什麼在上面的代碼片段被調用兩次run()方法?
  2. 誰在調用方法testRunning()什麼時候?這裏只是定義方法,但似乎沒有人調用這種方法。

P.S:我來自Java背景,對Python語法本身並不熟悉。

回答

1

我沒有權限訪問您正在討論的書,因此我要將您發佈的代碼片斷。

看起來像兩個不同對象上的run()方法被調用 - 類TestCaseTest之一,類WasRun之一(或任何名爲WasRun返回的函數)之一。

至於誰在調用testRunning(),則在TestCaseTest對象上調用.run(),這大概是來自超類TestCase的方法。在TestCase中查找run()並查看self.testRunning()是否在那裏調用。

+0

我已經添加了基準類的代碼供您細讀。看來我現在明白了。運行方法的最後一行是關鍵。 – Inquisitive 2013-03-24 15:53:38

+0

好吧,所以有一個方法是基於self.name屬性檢索和運行的。運行哪種方法取決於TestCase如何初始化,如果self.name是「hello」,那麼調用的方法是self.hello()。很高興聽到它在上下文中對你有意義。 – svk 2013-03-24 16:06:55

+0

順便說一句,這是在Python中稱爲*可插入選擇器*的機制? – Inquisitive 2013-03-24 16:12:37