2013-10-01 75 views
1

我有一個測試用例,幫助器方法assertContains(super, sub)sub參數是測試用例的硬編碼部分。如果他們格式不正確,我想讓我的測試用例中止並出錯。如何從python單元測試信號發出測試錯誤(不是失敗)

我該怎麼做?我試過

def assertContains(super, sub): 
    if isinstance(super, foo): ... 
    elif isinstance(super, bar): ... 
    else: assert False, repr(sub) 

但是,這會將測試轉變爲失敗而不是錯誤。

我可以提出一些其他異常(例如ValueError),但我想明確說明我聲明測試用例是錯誤的。我可以做的事情如ErrorInTest = ValueError然後raise ErrorInTest(repr(sub)),但它感覺有點'icky。我覺得應該採用電池供電的方式來做這件事,但是閱讀友好的手冊並沒有給我提出任何建議。

回答

1

對於TestCase類中的方面,有一個assertRaises(),其中您要確保由待測代碼引發錯誤。

如果您想在此處引發錯誤並中止測試該單元(並繼續進行下一個單元測試),請提升未捕獲的異常;單元測試模塊將趕上它:

raise NotImplementedError("malformed sub: %r" % (sub,)) 

我不認爲有可用除了直接提高錯誤陳述的任何其他API方面,一個單元測試用例導致錯誤。

class PassingTest(unittest.TestCase): 
    def runTest(self): 
    self.assertTrue(True) 

class FailingTest(unittest.TestCase): 
    def runTest(self): 
    self.assertTrue(False) 

class ErrorTest(unittest.TestCase): 
    def runTest(self): 
    raise NotImplementedError("error") 

class PassingTest2(unittest.TestCase): 
    def runTest(self): 
    self.assertTrue(True) 

結果:

EF.. 
====================================================================== 
ERROR: runTest (__main__.ErrorTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "./t.py", line 15, in runTest 
    raise NotImplementedError("error") 
NotImplementedError: error 

====================================================================== 
FAIL: runTest (__main__.FailingTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "./t.py", line 11, in runTest 
    self.assertTrue(False) 
AssertionError: False is not true 

---------------------------------------------------------------------- 
Ran 4 tests in 0.002s 

FAILED (failures=1, errors=1)