2016-10-25 170 views
-2
import unittest 

class TestTemplate(unittest.TestCase): 

    @classmethod 
    def setUpClass(self): 
     self.result = 'error' 
     print "setUpClass" 

    @classmethod 
    def tearDownClass(self): 
     print "The value of result is, ",self.result 
     if self.result == 'ok': 
      print "it is working" 
     print "The value of cls result is : ", self.result 
     print "TearDownClass" 


class MyTest(TestTemplate): 

    def test_method_one(self): 
     self.result = 'ok' 
     print self.result 


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

tearDownClass self.result的值是error變量的值,而是應該okay,因爲我的方法改變了嗎?有沒有解決這個問題?變化的單元測試蟒蛇

回答

3

您在setUp方法改變類屬性,並在tearDown再次讀它,因爲兩者都是類方法。但是,在您的測試中,您正在設置一個實例屬性。

你不得不把它放在類,而不是直接:

type(self).result = 'ok' 

MyTest.result = 'ok' 

它後者關係到當前的測試類,第一個選項讓它即使是在工作子類。

演示:

>>> import unittest 
>>> class TestTemplate(unittest.TestCase): 
...  @classmethod 
...  def setUpClass(self): 
...   self.result = 'error' 
...   print "setUpClass" 
...  @classmethod 
...  def tearDownClass(self): 
...   print "The value of result is, ",self.result 
...   if self.result == 'ok': 
...    print "it is working" 
...   print "The value of cls result is : ", self.result 
...   print "TearDownClass" 
... 
>>> class MyTest(TestTemplate): 
...  def test_method_one(self): 
...   type(self).result = 'ok' 
...   print self.result 
... 
>>> unittest.main(exit=False) 
setUpClass 
ok 
.The value of result is, ok 
it is working 
The value of cls result is : ok 
TearDownClass 

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

OK 
<unittest.main.TestProgram object at 0x103945090> 

但是,你一般要避免在各個測試更改測試類的狀態。使用現有的test runner facilities來追蹤測試結果;所有

setUpClasstearDownClass方法可以應用到多個測試(取決於如何測試運行),所以狀態是共享的。

+0

具有很多意義。但是在python中改變測試類的狀態是否是一個好習慣?我試圖存儲每個測試的結果,無論它通過了還是失敗。@ Martjin Pieters –

+0

@HarshdeepSingh:類的狀態與實例狀態一樣動態;如果你需要在實例之間共享狀態,那麼在課堂上這樣做很好。爲什麼你需要將每個測試的結果存儲在測試類中呢?測試運動員已經爲你跟蹤狀態。 –

+0

@HarshdeepSingh你應該檢查https://docs.python.org/2/library/unittest.html#unittest.TestResult,正如Martijn所說的,而不是試圖自己收集結果。 – ElmoVanKielmo

0

嘗試使用self.__class__.result = "ok"

它不工作的原因是setUpClass()是(因爲@classmethod裝飾的)一個方法,所以self參數實際上是存在的一類。因此self.result = 'error'更改類屬性。

+0

通常,'type(self)'比'self____ class__'更可取。只能將'self .__ class__'用於舊式的Python類。 –