2013-03-20 26 views
1

我與TestCase的雙繼承一個python UNITEST腳本如下:如何才能使我的單一測試方法只有一次?

import unittest 
class Upper(unittest.TestCase): 
    def test_dummy(self): 
     pass 

class Lower(Upper): 
    pass 

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

的思想是定義與測試方法的具體實現上流,並從這個類派生(在不同的子目錄),其包含一些額外的設置功能。最後,有一個upper.py,從中衍生出許多不同的test_lower.py。測試方法僅在upper.py中實施。

鑑於上面的例子,我現在只做一個python test_example.py來看到python試圖運行2個測試!該腳本只包含一個測試,那爲什麼unittest要執行兩個測試?

我認爲單元測試發現內Lower一個測試和Upper一個測試在某種程度上,但我只想要執行它在Lower(因爲額外的和需要設置的功能)測試發現。我怎樣才能做到這一點?

上下文在實際情況下,兩個類定義在兩個不同的文件中,駐留在兩個目錄中。也許這有幫助。

回答

0

Unittest庫迭代TestCase子類屬性,查找以test_開頭的方法。如果是Lower測試用例,它會從其父項繼承一個方法,所以它會執行兩次 - 一次在Upper測試用例中,第二次在Lower類中執行。 如果兩者的測試用例是爲了運行,我看到的唯一的解決辦法是讓如果你想測試一個父類中運行拿出test_dummy測試的Upper

的其他子類,但跳過一些它的子類,試試這個:

import unittest 
class Upper(unittest.TestCase): 
    def test_dummy(self): 
     pass 

class Lower(Upper): 
    def test_dummy(self): 
     return # skip test 

    @unittest.skip # or this - but ugly 
    def test_dummy(self): 
     return # skip test 

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

UPDATE:

我想現在我明白你想要什麼:你想只在子類中運行測試方法。那麼我建議你來繼承objectUpper,和子類 - 無論是從UpperTestCase

import unittest 

class Upper(object): 

    def test_dummy(self): 
     self.assertTrue(True) 

class Lower(unittest.TestCase, Upper): 

    pass 

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

運行:

python test2.py -v 
test_dummy (__main__.Lower) ... ok 

---------------------------------------------------------------------- 
Ran 1 test in 0.000s 

OK 
+0

我不太明白你的建議是什麼。測試方法必須駐留在'Upper'中,這就是這個想法的重點。我不想將完全相同的測試方法代碼複製並粘貼到多個dubdirectories中。 – Alex 2013-03-20 14:19:48

+0

如果跳過了,我顯示一個測試正在運行,一個跳過。這是不可接受的,因爲我需要運行所有測試,而沒有跳過測試。 – Alex 2013-03-20 14:28:21

+0

好主意,但我需要'unittest'的功能在INSERT類的'upper'中。 (實際上,我不直接使用'unittest',而是使用不同的派生類,並且需要使用函數內部)。 – Alex 2013-03-20 14:36:26

相關問題