def _run_worker(self, test: Test) -> TestVector: '''Run one unit test returning the TestVector''' # Save the original module and qualname to restore it before returning # the TestVector. Otherwise, Pickle will complain if the classes can't # be found in global scope. The trick here is that we change the names # momentarily just to obtain the error traces in str format test_cls = type(test) module_orig = test_cls.__module__ qualname_orig = test_cls.__qualname__ self._rename_test(test, test.decoder.name, test.test_suite.name) test_result = TestResult() test(test_result) line = '.' if test_result.failures: line = 'F' elif test_result.errors: line = 'E' print(line, end='', flush=True) self._collect_results(test_result) self._rename_test(test, module_orig, qualname_orig) return test.test_vector
def _wait_for_test_done(cls, test: FirmwareTestClass, router: Router, done_event: DoneEvent) -> None: """ Wait 5 minutes until the test is done. Handles the result from the tests. Triggers the next job/test. :param test: test to execute :param router: the Router """ logging.debug("%sWait for test" + str(test), LoggerSetup.get_log_deep(2)) try: async_result = cls._task_pool.apply_async(func=cls._execute_test, args=(test, router)) result = async_result.get( 300) # wait 5 minutes or raise an TimeoutError logging.debug("%sTest done " + str(test), LoggerSetup.get_log_deep(1)) logging.debug("%sFrom " + str(router), LoggerSetup.get_log_deep(2)) cls._test_results.append((router.id, str(test), result)) except Exception as e: # TODO #105 logging.error("%sTest raised an Exception: " + str(e), LoggerSetup.get_log_deep(1)) result = TestResult() result._original_stdout = None result._original_stderr = None # result.addError(None, (type(exception), exception, None)) # TODO exception handling for failed Tests cls._test_results.append((router.id, str(test), result)) finally: cls.set_running_task(router, None) # logging.debug(str(cls._test_results)) # start next test in the queue done_event.set() cls.__start_task(router, None)
def _execute_test(cls, test: FirmwareTestClass, router: Router) -> TestResult: if not isinstance(router, Router): raise ValueError("Chosen Router is not a real Router...") # proofed: this method runs in other process as the server logging.debug("%sExecute test " + str(test) + " on " + str(router), LoggerSetup.get_log_deep(2)) test_suite = defaultTestLoader.loadTestsFromTestCase(test) # prepare all test cases for test_case in test_suite: logging.debug("%sTestCase " + str(test_case), LoggerSetup.get_log_deep(4)) test_case.prepare(router) result = TestResult() cls.__setns(router) try: result = test_suite.run( result) # TODO if debug set, run as debug() except Exception as e: logging.error("%sTestCase raised an exception", LoggerSetup.get_log_deep(3)) logging.error("%s" + str(e), LoggerSetup.get_log_deep(3)) finally: # I'm sry for this dirty hack, but if you don't do this you get an # "TypeError: cannot serialize '_io.TextIOWrapper' object" because sys.stdout is not serializeable... result._original_stdout = None result._original_stderr = None logging.debug("%sResult from test " + str(result), LoggerSetup.get_log_deep(3)) return result
def run_suite(self, suite, **kwargs): if browser == 'Sauce' and sauce_accesskey == '' and sauce_username == '': print('Sauce selected but no accesskey and username - test suite will not run') return TestResult() else: return super(Runner, self).run_suite(suite, **kwargs)