Просмотр исходного кода

ci ttfw: Consistently handle unexpected exceptions in test cases

Angus Gratton 5 лет назад
Родитель
Сommit
441d1306be

+ 1 - 1
tools/ci/python_packages/tiny_test_fw/DUT.py

@@ -439,7 +439,7 @@ class BaseDUT(object):
         if isinstance(data, type(u'')):
             try:
                 data = data.encode('utf-8')
-            except Exception as e:
+            except UnicodeEncodeError as e:
                 print(u'Cannot encode {} of type {}'.format(data, type(data)))
                 raise e
         return data

+ 1 - 5
tools/ci/python_packages/tiny_test_fw/TinyFW.py

@@ -15,7 +15,6 @@
 """ Interface for test cases. """
 import os
 import time
-import traceback
 import functools
 import socket
 from datetime import datetime
@@ -195,10 +194,7 @@ def test_method(**kwargs):
                 # if finish without exception, test result is True
                 result = True
             except Exception as e:
-                # handle all the exceptions here
-                traceback.print_exc()
-                # log failure
-                junit_test_case.add_failure_info(str(e) + ":\r\n" + traceback.format_exc())
+                Utility.handle_unexpected_exception(junit_test_case, e)
             finally:
                 # do close all DUTs, if result is False then print DUT debug info
                 close_errors = env_inst.close(dut_debug=(not result))

+ 14 - 0
tools/ci/python_packages/tiny_test_fw/Utility/__init__.py

@@ -2,6 +2,7 @@ from __future__ import print_function
 import os.path
 import sys
 import time
+import traceback
 
 from .. import Env
 
@@ -95,3 +96,16 @@ def load_source(path):
             sys.path.remove(dir)
         __LOADED_MODULES[path] = ret
         return ret
+
+
+def handle_unexpected_exception(junit_test_case, exception):
+    """
+    Helper to log & add junit result details for an unexpected exception encountered
+    when running a test case.
+
+    Should always be called from inside an except: block
+    """
+    traceback.print_exc()
+    # AssertionError caused by an 'assert' statement has an empty string as its 'str' form
+    e_str = str(exception) if str(exception) else repr(exception)
+    junit_test_case.add_failure_info("Unexpected exception: {}\n{}".format(e_str, traceback.format_exc()))

+ 4 - 3
tools/unit-test-app/unit_test.py

@@ -24,6 +24,7 @@ import argparse
 import threading
 
 from tiny_test_fw import TinyFW, Utility, Env, DUT
+from tiny_test_fw.Utility import handle_unexpected_exception
 import ttfw_idf
 
 UT_APP_BOOT_UP_DONE = "Press ENTER to see the list of tests."
@@ -317,7 +318,7 @@ def run_unit_test_cases(env, extra_data):
             except TestCaseFailed:
                 failed_cases.append(format_case_name(one_case))
             except Exception as e:
-                junit_test_case.add_failure_info("Unexpected exception: " + str(e))
+                handle_unexpected_exception(junit_test_case, e)
                 failed_cases.append(format_case_name(one_case))
             finally:
                 TinyFW.JunitReport.update_performance(performance_items)
@@ -517,7 +518,7 @@ def run_multiple_devices_cases(env, extra_data):
                 result = run_one_multiple_devices_case(duts, ut_config, env, one_case,
                                                        one_case.get('app_bin'), junit_test_case)
             except Exception as e:
-                junit_test_case.add_failure_info("Unexpected exception: " + str(e))
+                handle_unexpected_exception(junit_test_case, e)
             finally:
                 if result:
                     Utility.console_log("Success: " + format_case_name(one_case), color="green")
@@ -677,7 +678,7 @@ def run_multiple_stage_cases(env, extra_data):
             except TestCaseFailed:
                 failed_cases.append(format_case_name(one_case))
             except Exception as e:
-                junit_test_case.add_failure_info("Unexpected exception: " + str(e))
+                handle_unexpected_exception(junit_test_case, e)
                 failed_cases.append(format_case_name(one_case))
             finally:
                 TinyFW.JunitReport.update_performance(performance_items)