What are the advantages or difference in “assert False” and “self.assertFalse”

chrisg picture chrisg · Jun 2, 2010 · Viewed 30.1k times · Source

I am writing tests and I have heard some people saying to use self.assertFalse rather than assert False. Why is this and are there any advantages to be had?

Answer

unutbu picture unutbu · Jun 2, 2010

If you run

import unittest

class Test_Unittest(unittest.TestCase):
    def test_assert(self):
        assert False
    def test_assertFalse(self):
        self.assertFalse(True)

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

You get the same logging information, the same failure:

FF
======================================================================
FAIL: test_assert (__main__.Test_Unittest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/unutbu/pybin/test.py", line 6, in test_assert
    assert False
AssertionError

======================================================================
FAIL: test_assertFalse (__main__.Test_Unittest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/unutbu/pybin/test.py", line 8, in test_assertFalse
    self.assertFalse(True)
AssertionError

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (failures=2)

The reason both are handled the same is because unittest.TestCase defines

failureException = AssertionError

When you say assert False an AssertionError is raised.

When you say self.assertFalse(True), a failureExeception is raised.

Since these exceptions are the same, there is no apparent difference.

assert and self.assertFalse do differ in conventional usage, however.

assert is used to declare that a certain condition should hold at a certain point in the code. It is used as a crutch during development, but is not meant to be used in production code. If you run python -O my_unittest.py, all assert statements are ignored. That would subvert your intended usage of assert, possibly making your unit tests pass even when there is a failure.

Even though (without the -O flag) the result is the same, assert is not meant to be used in unit test code. Use self.assertTrue or self.assertFalse when writing unit tests.