2011-05-08 56 views
1

我正在編寫unittest.TestCase的一個子類來抽象我們的代碼的一些細節,並且我想使用我自己的斷言函數,但是我需要這個斷言結果將被報告到測試結果。我想重新使用單元測試斷言功能是這樣的:Python單元測試:如何重用TestCase.assert函數

class MyTestCase(unittest.TestCase): 
    def assertState(state, value): 
     if state_dict[state] == value: 
      self.assertTrue(True) 
     else: 
      self.assertTrue(False) 

的問題是,asserrState在我MyTestCase的情況下,呼叫將代替報告報告錯誤的測試結果對象的assertError。

請建議我如何在unittest.TestCase的子類中編寫自己的斷言函數。

編輯: 我想完成的是提供我們自己的MyTestCase類作爲基類,其中包含更多的具有業務邏輯的斷言功能。這樣,真正的測試可以繼承MyTestCase並在不重複相同代碼的情況下使用這些斷言。這意味着我希望能夠在MyTestCase的子類中調用MyTestCase.assertState,並將測試失敗報告給具體的測試結果。像下面這樣。

class ConcreteTestCase(MyTestCase): 
    def test_1(self): 
     #do something here 
     self.assertState("state", "on") 

請讓我知道是否有辦法做到這一點。

+1

在源文件中的單元測試一看,它可能有一些暗示。 – 2011-05-08 07:56:34

+0

我想我沒有說清楚我的問題。我想要做的是基本上使用裝飾模式,MyTestCase將派生自unittest.TestCase類,但提供更多斷言功能,如assertState。具體的測試將是一個具體的測試用例,它將繼承MyTestCase。這將允許我們添加更多的斷言方法,包括我們自己的業務邏輯。 – ycseattle 2011-05-08 16:36:44

回答

1

首先,您忘記了self參數。其次,你如何運行它?如果你真的想測試結果的對象,那你是怎麼做到這一點:

In [1]: import unittest 

In [2]: state_dict = {1:2} 

In [3]: class MyTestCase(unittest.TestCase): 
    ...:   def assertState(self, state, value): 
    ...:    if state_dict[state] == value: 
    ...:     self.assertTrue(True) 
    ...:   else: 
    ...:     self.assertTrue(False) 
    ...:  def runTest(self): 
    ...:   self.assertState(1,2) 
    ...:   self.assertState(1,1) 
    ...: 

In [4]: r = unittest.TestResult() 

In [5]: MyTestCase().run(r) 

In [6]: r 
Out[6]: <unittest.TestResult run=1 errors=0 failures=1> 

In [7]: r.errors 
Out[7]: [] 

In [8]: r.failures 
Out[8]: 
[(<__main__.MyTestCase testMethod=runTest>, 
    'Traceback (most recent call last):\n File "<ipython console>", line 9, in runTest\n File "<ipython console>", line 6, in assertState\nAssertionError\n')] 
+0

嗨letbebee,這是接近我想要的,但我想我沒有更好地陳述原始問題。我想要做的是將unittest.TestCase作爲我們自己的TestCase基類的子類,因此測試者可以通過繼承MyTestCase來編寫具體的測試,MyTestCase會提供更多的斷言函數,所以MyTestCase的子類可以使用新的斷言方法。這就像裝飾者模式。有沒有一個好的方法來做到這一點? – ycseattle 2011-05-08 16:34:44

+0

什麼似乎是問題?我只是將MyTestCase與實際的測試案例結合起來,以節省一些打字工作,沒有什麼能夠阻止您繼續進行子類化。 – letitbee 2011-05-09 08:29:20

2
class MyTestCase(unittest.TestCase): 
    def assertState(self, state, value): 
    self.assertEqual(value, self.state_dict[state]) 

    def test_whatever(self): 
    self.assertState(1, 1) 
    self.assertState(2, 2) 
1

很晚了答覆,但最終的解決方案是定義我自己的TestCase子類時,我遇到了同樣的問題。對於尋找相同事物的其他人可能會有所幫助。

您只需將__unittest = True添加到定義類的模塊中即可。現在

import unittest 

__unittest = True 

class MyTestCase(unittest.TestCase): 
    def assertState(state, value): 
     if state_dict[state] != value: 
      standardMsg = 'the state %s does not match %s' % (state, value) 
      self.fail(self._formatMessage(msg, standardMsg)) 

用戶定義的斷言方法完全一樣的那些unittest.TestCase生成,而不會顯示失敗時不必要的堆棧跟蹤。

工程上的Python 2.7

來源:http://www.gossamer-threads.com/lists/python/python/1014779

相關問題