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

前端 未结 3 2049
孤街浪徒
孤街浪徒 2020-12-08 00:50

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?

3条回答
  •  一生所求
    2020-12-08 01:26

    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.

提交回复
热议问题