Jonas Kölker
Jonas Kölker

Reputation: 7837

How do I signal test error (not failure) from python unittest

I have a test case with a helper method assertContains(super, sub). The sub arguments are a hard-coded part of the test cases. In case they're malformed, I would like my test case to abort with an error.

How do I do that? I have tried

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

However, this turns the test into a failure rather than an error.

I could raise some other exception (e.g. ValueError), but I want to explicitly state that I'm declaring the test case to be in error. I could do things like ErrorInTest = ValueError and then raise ErrorInTest(repr(sub)), but it feels kinda' icky. I feel there should be a batteries-included way of doing this, but reading the friendly manual didn't suggest anything to me.

Upvotes: 1

Views: 2946

Answers (1)

Alfe
Alfe

Reputation: 59426

There is an assertRaises() for aspects in class TestCase in which you want to ensure an error is raised by the to-be-tested code.

If you want to raise an error and abort testing that unit at this point (and continue with the next unit test), just raise an uncaught exception; the unit test module will catch it:

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

I don't think that there is any other API aspect available besides raising errors directly to state that a unit test case results in an error.

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)

results in:

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)

Upvotes: 1

Related Questions