Continuing in Python's unittest when an assertion fails

前端 未结 12 1577
感情败类
感情败类 2020-11-27 14:03

EDIT: switched to a better example, and clarified why this is a real problem.

I\'d like to write unit tests in Python that continue executing when an assertion fails

12条回答
  •  旧时难觅i
    2020-11-27 14:42

    There is a soft assertion package in PyPI called softest that will handle your requirements. It works by collecting the failures, combining exception and stack trace data, and reporting it all as part of the usual unittest output.

    For instance, this code:

    import softest
    
    class ExampleTest(softest.TestCase):
        def test_example(self):
            # be sure to pass the assert method object, not a call to it
            self.soft_assert(self.assertEqual, 'Worf', 'wharf', 'Klingon is not ship receptacle')
            # self.soft_assert(self.assertEqual('Worf', 'wharf', 'Klingon is not ship receptacle')) # will not work as desired
            self.soft_assert(self.assertTrue, True)
            self.soft_assert(self.assertTrue, False)
    
            self.assert_all()
    
    if __name__ == '__main__':
        softest.main()
    

    ...produces this console output:

    ======================================================================
    FAIL: "test_example" (ExampleTest)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "C:\...\softest_test.py", line 14, in test_example
        self.assert_all()
      File "C:\...\softest\case.py", line 138, in assert_all
        self.fail(''.join(failure_output))
    AssertionError: ++++ soft assert failure details follow below ++++
    
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    The following 2 failures were found in "test_example" (ExampleTest):
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    Failure 1 ("test_example" method)
    +--------------------------------------------------------------------+
    Traceback (most recent call last):
      File "C:\...\softest_test.py", line 10, in test_example
        self.soft_assert(self.assertEqual, 'Worf', 'wharf', 'Klingon is not ship receptacle')
      File "C:\...\softest\case.py", line 84, in soft_assert
        assert_method(*arguments, **keywords)
      File "C:\...\Python\Python36-32\lib\unittest\case.py", line 829, in assertEqual
        assertion_func(first, second, msg=msg)
      File "C:\...\Python\Python36-32\lib\unittest\case.py", line 1203, in assertMultiLineEqual
        self.fail(self._formatMessage(msg, standardMsg))
      File "C:\...\Python\Python36-32\lib\unittest\case.py", line 670, in fail
        raise self.failureException(msg)
    AssertionError: 'Worf' != 'wharf'
    - Worf
    + wharf
     : Klingon is not ship receptacle
    
    +--------------------------------------------------------------------+
    Failure 2 ("test_example" method)
    +--------------------------------------------------------------------+
    Traceback (most recent call last):
      File "C:\...\softest_test.py", line 12, in test_example
        self.soft_assert(self.assertTrue, False)
      File "C:\...\softest\case.py", line 84, in soft_assert
        assert_method(*arguments, **keywords)
      File "C:\...\Python\Python36-32\lib\unittest\case.py", line 682, in assertTrue
        raise self.failureException(msg)
    AssertionError: False is not true
    
    
    ----------------------------------------------------------------------
    Ran 1 test in 0.000s
    
    FAILED (failures=1)
    

    NOTE: I created and maintain softest.

提交回复
热议问题