2013-01-13 106 views
37

我的Python版本是2.6。只運行一次setUp

我想只執行setUp方法一次,因爲我在那裏做每個測試都需要的東西。

我的想法是創建一個布爾變量,它將在第一次執行後設置爲'true'。

class mySelTest(unittest.TestCase): 
    setup_done = False 

    def setUp(self): 
        print str(self.setup_done) 
             
        if self.setup_done: 
            return 
        self.setup_done = True 
        print str(self.setup_done) 

輸出:

False 

True 

--- Test 1 --- 

False 

True 

--- Test 2 --- 

這是爲什麼不工作? 我錯過了什麼嗎?

+4

Unittest爲每個測試創建不同的實例 –

+2

不要這樣做。實施其他一些機制。但不要試圖改變'setUp'的含義。 –

+0

[Unittest setUp/tearDown for several tests]可能重複(https://stackoverflow.com/questions/8389639/unittest-setup-teardown-for-several-tests) –

回答

62

您可以使用setUpClass定義每個測試套件只運行一次的方法。

+0

感謝您的回覆。由於我使用Python 2.6.6,setUpClass不可用。 – Kesandal

+2

@JohnM .:您可以下載unittest2 backport軟件包,並在舊的python-dist上獲取所有新的東西。 – Macke

2

不要試圖去重新調用setUp,只需調用一次。

例如:

class MyClass(object): 
    ... 

def _set_up(): 
    code to do one-time setup 

_set_up() 

這將調用_set_up()第一裝載模塊的時。我已經將它定義爲一個模塊級函數,但您可以同樣將它作爲MyClass的類方法。

0

將您想要設置的所有代碼放置在mySelTest之外。

setup_done = False 

class mySelTest(unittest.TestCase): 

    def setUp(self): 
     print str(setup_done) 

     if setup_done: 
      return 

     setup_done = True 
     print str(setup_done) 

另一種可能性是有,你在setUp()實例化一個單例類,這將只運行一次__new__代碼,並返回對象實例調用的其餘部分。 請參閱:Is there a simple, elegant way to define singletons?

class Singleton(object): 
    _instance = None 
    def __new__(cls, *args, **kwargs): 
     if not cls._instance: 
      cls._instance = super(Singleton, cls).__new__(
          cls, *args, **kwargs) 
      # PUT YOUR SETUP ONCE CODE HERE! 
      cls.setUpBool = True 

     return cls._instance 

class mySelTest(unittest.TestCase): 

    def setUp(self): 
     # The first call initializes singleton, ever additional call returns the instantiated reference. 
     print(Singleton().setUpBool) 

你的工作方式太雖然。

+0

謹慎解釋downvote? – NuclearPeon

29

Daniel's answer是正確的,但這裏是一個例子,以避免我發現的一些常見錯誤,例如不要在setUpClass()中調用super()

setUpClass()的文檔沒有提及您需要致電super()。如果你不這樣做,你會得到一個錯誤,如this related question所示。

class SomeTest(TestCase): 
    def setUp(self): 
     self.user1 = UserProfile.objects.create_user(resource=SomeTest.the_resource) 

    @classmethod 
    def setUpClass(cls): 
     """ get_some_resource() is slow, to avoid calling it for each test use setUpClass() 
      and store the result as class variable 
     """ 
     super(SomeTest, cls).setUpClass() 
     cls.the_resource = get_some_resource()