def run(self, result): """ Emulate unittest's behavior, with Green-specific changes. """ topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for index, test in enumerate(self): if result.shouldStop: break if _isnotsuite(test): self._tearDownPreviousClass(test, result) self._handleModuleFixture(test, result) self._handleClassSetUp(test, result) result._previousTestClass = test.__class__ if (getattr(test.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): continue if not self.allow_stdout: captured_stdout = StringIO() captured_stderr = StringIO() saved_stdout = sys.stdout saved_stderr = sys.stderr sys.stdout = GreenStream(captured_stdout) sys.stderr = GreenStream(captured_stderr) test(result) if _isnotsuite(test): if not self.allow_stdout: sys.stdout = saved_stdout sys.stderr = saved_stderr result.recordStdout(test, captured_stdout.getvalue()) result.recordStderr(test, captured_stderr.getvalue()) # Since we're intercepting the stdout/stderr out here at the suite # level, we need to poke the test result and let it know when we're # ready to transmit results back up to the parent process. I would # rather just do it automatically at test stop time, but we don't # have the captured stuff at that point. Messy...but the only other # alternative I can think of is monkey-patching loaded TestCases -- # which could be from unittest or twisted or some other custom # subclass. result.finalize() self._removeTestAtIndex(index) if topLevel: self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result) result._testRunEntered = False return result
def run(self, result, debug=False): top_level = False # getattr()函数,返回result对象的_testRunEntered属性值,默认值是False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = top_level = True for index, test in enumerate(self): if result.shouldStop: break if _isnotsuite(test): self._tearDownPreviousClass(test, result) self._handleModuleFixture(test, result) self._handleClassSetUp(test, result) result._previousTestClass = test.__class__ if (getattr(test.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): continue if not debug: test(result) else: test.debug() if self._cleanup: self._removeTestAtIndex(index) if top_level: self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result) result._testRunEntered = False return result
def run_suite(self, suite, result, run_func=None, interval=None): """基础运行suite方法,支持指定运行方法""" log.info('执行测试套件:', suite) topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for index, test in enumerate(suite): if _isnotsuite(test): setup_ok = run_suite_before_case(suite, test, result) if not setup_ok: continue log.info('执行用例:', test.id()) run_func(test, result) if run_func else test(result) # 可能是suite 可能有异常 log.info('执行结果:', test.status, '执行时间:', test.duration) time.sleep(interval) if interval else None if suite._cleanup: suite._removeTestAtIndex(index) if topLevel: run_suite_after(suite, result) result._testRunEntered = False return result
def run(self, result, debug=False): topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for test in self: if result.shouldStop: break start_time = _time() if _isnotsuite(test): self._tearDownPreviousClass(test, result) self._handleModuleFixture(test, result) self._handleClassSetUp(test, result) result._previousTestClass = test.__class__ if (getattr(test.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): continue if not debug: test(result) else: test.debug() TIMINGS[str(test)] = _time() - start_time if topLevel: self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result) result._testRunEntered = False return result
def run(self, result, debug=False): topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for test in self: if result.shouldStop: break if _isnotsuite(test): self._tearDownPreviousClass(test, result) self._handleModuleFixture(test, result) self._handleClassSetUp(test, result) result._previousTestClass = test.__class__ if (getattr(test.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): continue if not debug: test(result) else: test.debug() if topLevel: self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result) result._testRunEntered = False return result
def run(self, result): """ Emulate unittest's behavior, with Green-specific changes. """ topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for index, test in enumerate(self): if result.shouldStop: break if _isnotsuite(test): self._tearDownPreviousClass(test, result) self._handleModuleFixture(test, result) self._handleClassSetUp(test, result) result._previousTestClass = test.__class__ if (getattr(test.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): continue if not self.allow_stdout: captured_stdout = StringIO() captured_stderr = StringIO() saved_stdout = sys.stdout saved_stderr = sys.stderr sys.stdout = GreenStream(captured_stdout) sys.stderr = GreenStream(captured_stderr) test(result) if _isnotsuite(test): if not self.allow_stdout: sys.stdout = saved_stdout sys.stderr = saved_stderr result.recordStdout(test, captured_stdout.getvalue()) result.recordStderr(test, captured_stderr.getvalue()) self._removeTestAtIndex(index) if topLevel: self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result) result._testRunEntered = False return result
def run(self, result, debug=False): topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for index, test in enumerate(self): retry = getattr(test, "retry", python_config.RETRY) if result.shouldStop: break for i in range(1, retry + 2): if _isnotsuite(test): self._tearDownPreviousClass(test, result) self._handleModuleFixture(test, result) self._handleClassSetUp(test, result) # result._previousTestClass = test.__class__ if (getattr(test.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): continue logger.info("用例: {}正在尝试第{}次运行!".format(test.__class__.__name__, i)) if not debug: test(result) else: test.debug() if i < retry + 1: # 重试判断 这段写的很丑就别细看了,欢迎优化 error, fail = None, None fail_id = [x.get("case_id") for x in result.failures] error_id = [x.get("case_id") for x in result.errors] if test.case_id in fail_id: fail = fail_id.index(test.case_id) if test.case_id in error_id: error = error_id.index(test.case_id) if error is not None and fail is not None: break elif error is not None: logger.warning("用例: {} 第{}次失败 原因: {}".format( test.__class__.__name__, i, str(result.errors[error]['msg']))) del result.errors[error] elif fail is not None: logger.warning("用例: {} 第{}次失败 原因: {}".format( test.__class__.__name__, i, str(result.failures[fail]['msg']))) del result.failures[fail] result._previousTestClass = test.__class__ continue if self._cleanup: self._removeTestAtIndex(index) if topLevel: self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result) result._testRunEntered = False return result
def run(self, result, debug=False): """ overrides TestSuite's run() method, with few changes, except that this method swaps in the template db before each test is run! """ if self.test_db_name is None or self.template_db_name is None: err_msg = 'test_db_name & template_db_name must be set before run() can be called!' raise self.SetupException(err_msg) topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for test in self: if result.shouldStop: break # # previous to the test execution, # copy our template test db into the test db # and then instantiate the test # TODO - db connection.close() PgUtil.clone_db(self.template_db_name, self.test_db_name, self.requires_sudo) # TODO - settings.DATABASES[self.connection.alias]["NAME"] = self.test_db_name # TODO - self.connection.settings_dict["NAME"] = self.test_db_name # TODO - not sure if we HAVE to do this, but try it with it and without it connection.ensure_connection() countdown = 5 while countdown >= 0: time.sleep(0.5) SSHELP.check_score_systems() countdown -= 0.5 if _isnotsuite(test): self._tearDownPreviousClass(test, result) self._handleModuleFixture(test, result) self._handleClassSetUp(test, result) result._previousTestClass = test.__class__ if (getattr(test.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): continue if not debug: # # now make the test test(result) else: test.debug() if topLevel: self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result) result._testRunEntered = False return result
def run(self, result, debug=False): print(result, '打印结果') fail_count = 5 class_num = 1 topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for test in self: case_num = 1 if result.shouldStop: break success_flag = True while success_flag: if _isnotsuite(test): self._tearDownPreviousClass(test, result) self._handleModuleFixture(test, result) self._handleClassSetUp(test, result) result._previousTestClass = test.__class__ if (getattr(test.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): if class_num > fail_count: success_flag = False else: time.sleep(5) result._previousTestClass = None print('%s Retrying init for %s times...' % (test.__class__, class_num)) class_num += 1 continue if not debug: print(test(result), '打印test结果') test(result) print('1') else: test.debug() if result.result[-1][0] == 1 or result.result[-1][ 0] == 2: # 1为Failed,2为Error if case_num > fail_count: success_flag = False else: print('%s is Failed ! Retrying %s times...' % (test, case_num)) case_num += 1 else: success_flag = False if topLevel: self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result) result._testRunEntered = False return result
def run(self, result, debug=False): failcount = 1 #失败总运行次数 class_num = 1 topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for test in self: case_num = 1 if result.shouldStop: break success_flag = True while success_flag: if suite._isnotsuite(test): self._tearDownPreviousClass(test, result) self._handleModuleFixture(test, result) self._handleClassSetUp(test, result) result._previousTestClass = test.__class__ if (getattr(test.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): if class_num > failcount: success_flag = False else: time.sleep(5) result._previousTestClass = None print '类%s第%s次重新初始化执行' % (test.__class__, class_num) class_num += 1 continue if not debug: test(result) else: test.debug() if result.result[-1][0] == 1 or result.result[-1][ 0] == 2: #结果为fail和err用例判断 if case_num > failcount: success_flag = False else: print '用例%s第%s次重新执行' % (test, case_num) case_num += 1 else: success_flag = False if topLevel: self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result) result._testRunEntered = False return result
def run(self, result, debug=False): topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for test in self: if result.shouldStop: break if _isnotsuite(test): deferred = self._tearDownPreviousClass(test, result) if deferred is not None and hasattr(deferred, '__iter__'): for x in deferred: yield x yield self._handleModuleFixture(test, result) yield deferred = self._handleClassSetUp(test, result) if deferred is not None and hasattr(deferred, '__iter__'): for x in deferred: yield x yield result._previousTestClass = test.__class__ if (getattr(test.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): continue if not debug: deferred = test(result) if deferred is not None and hasattr(deferred, '__iter__'): for x in deferred: yield x else: deferred = test.debug() if deferred is not None and hasattr(deferred, '__iter__'): for x in deferred: yield x yield if topLevel: deferred = self._tearDownPreviousClass(None, result) if deferred is not None and hasattr(deferred, '__iter__'): for x in deferred: yield x yield yield self._handleModuleTearDown(result) yield result._testRunEntered = False
def run(self, result, debug=False): topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for index, test in enumerate(self): if result.shouldStop: break if _isnotsuite(test): deferred = self._tearDownPreviousClass(test, result) if isiterable(deferred): yield from deferred yield self._handleModuleFixture(test, result) yield deferred = self._handleClassSetUp(test, result) if isiterable(deferred): yield from deferred yield result._previousTestClass = test.__class__ if getattr(test.__class__, '_classSetupFailed', False) or \ getattr(result, '_moduleSetUpFailed', False): continue if not debug: deferred = test(result) else: deferred = test.debug() if self._cleanup: self._removeTestAtIndex(index) if isiterable(deferred): yield from deferred yield if topLevel: deferred = self._tearDownPreviousClass(None, result) if isiterable(deferred): yield from deferred yield yield self._handleModuleTearDown(result) yield result._testRunEntered = False
def _threadPoolExecutorTestCase(self, tmp_list, result): """多线程运行""" with ThreadPoolExecutor(self.thread_count) as pool: for test_case in tmp_list: if _isnotsuite(test_case): self._tearDownPreviousClass(test_case, result) self._handleModuleFixture(test_case, result) self._handleClassSetUp(test_case, result) result._previousTestClass = test_case.__class__ if (getattr(test_case.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): continue pool.submit(test_case, result) time.sleep(self.thread_start_wait) self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result)
def new_run(self, result, debug=False): """ :param self: 表示'suit'实例对象 :param result: 测试结果报告 :param debug: :return: 动态修改'suite.py'文件中'TestSuite'类中的'run'方法 1.为实例对象'suite'<TestSuite>动态修改实例方法'run' 2.目的:启用多线程来执行case """ topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True # 多线程执行测试 pool = ThreadPoolExecutor(self.thread_num) for index, test in enumerate(self): if result.shouldStop: break if _isnotsuite(test): self._tearDownPreviousClass(test, result) self._handleModuleFixture(test, result) self._handleClassSetUp(test, result) result._previousTestClass = test.__class__ if (getattr(test.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): continue """ 启用多线程 调用方法 """ pool.submit(run_test_custom, self, test, result, debug, index).add_done_callback(show_result_custom) """ 等待所有线程执行完毕 """ pool.shutdown() log.info("线程全部执行完毕") if topLevel: self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result) result._testRunEntered = False return result
def run(self, result, debug=False): topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for test in self: if result.shouldStop: break start_time = _time() if _isnotsuite(test): self._tearDownPreviousClass(test, result) self._handleModuleFixture(test, result) self._handleClassSetUp(test, result) result._previousTestClass = test.__class__ if (getattr(test.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): continue if not debug: test(result) else: test.debug() self.save_test_time(str(test), _time() - start_time) if time_only: timing = _time() - start_time if timing > valid_time: print( "\n\033[31m{t:.4f}s\033[0m \033[94m{f}\033[0m".format( f=str(test), t=float(timing))) else: print( "\n\033[32m{t:.4f}s\033[0m \033[94m{f}\033[0m".format( f=str(test), t=float(timing))) if topLevel: self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result) result._testRunEntered = False return result
def run_suite(self, suite, result, run_func=None, interval=None): topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for index, test in enumerate(suite): if _isnotsuite(test): setup_ok = run_suite_before_case(suite, test, result) if not setup_ok: continue run_func(test, result) if run_func else test( result) # 可能是suite 可能有异常 time.sleep(interval) if interval else None if suite._cleanup: suite._removeTestAtIndex(index) if topLevel: run_suite_after(suite, result) result._testRunEntered = False return result
def run(self, result, debug=False): failcount = 3 # 失败总运行次数 class_num = 1 topLevel = False if getattr(result, '_testRunEntered', False) is False: result._testRunEntered = topLevel = True for test in self: case_num = 1 if result.shouldStop: break success_flag = True while success_flag: if _isnotsuite(test): self._tearDownPreviousClass(test, result) self._handleModuleFixture(test, result) self._handleClassSetUp(test, result) result._previousTestClass = test.__class__ if (getattr(test.__class__, '_classSetupFailed', False) or getattr(result, '_moduleSetUpFailed', False)): if class_num > failcount: success_flag = False else: time.sleep(5) result._previousTestClass = None print('类%s第%s次重新初始化执行' % (test.__class__, class_num)) class_num += 1 continue if not debug: test(result) else: test.debug() if result.result[-1][0] == 1 or result.result[-1][0] == 2: # 结果为fail和err用例判断 if case_num > failcount: success_flag = False else: print('用例%s第%s次重新执行' % (test, case_num)) case_num += 1 else: success_flag = False if topLevel: self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result) result._testRunEntered = False return result # 单个用例自动重跑装饰器,使用方法 @retry(2) # def retry(times = 3): # def retry_func(func): # def _(*args, **kwds): # for i in range(times): # try: # func(*args, **kwds) # return # except AssertionError: # pass # raise AssertionError(func) # return _ # return retry_func
def run(self, result): """ Emulate unittest's behavior, with Green-specific changes. """ topLevel = False if getattr(result, "_testRunEntered", False) is False: result._testRunEntered = topLevel = True for index, test in enumerate(self): if result.shouldStop: break if _isnotsuite(test): self._tearDownPreviousClass(test, result) self._handleModuleFixture(test, result) self._handleClassSetUp(test, result) result._previousTestClass = test.__class__ if getattr(test.__class__, "_classSetupFailed", False) or getattr( result, "_moduleSetUpFailed", False): continue if not self.allow_stdout: captured_stdout = StringIO() captured_stderr = StringIO() saved_stdout = sys.stdout saved_stderr = sys.stderr sys.stdout = GreenStream(captured_stdout) sys.stderr = GreenStream(captured_stderr) test(result) if _isnotsuite(test): if not self.allow_stdout: sys.stdout = saved_stdout sys.stderr = saved_stderr result.recordStdout(test, captured_stdout.getvalue()) result.recordStderr(test, captured_stderr.getvalue()) # Since we're intercepting the stdout/stderr out here at the # suite level, we need to poke the test result and let it know # when we're ready to transmit results back up to the parent # process. I would rather just do it automatically at test # stop time, but we don't have the captured stuff at that # point. Messy...but the only other alternative I can think of # is monkey-patching loaded TestCases -- which could be from # unittest or twisted or some other custom subclass. result.finalize() self._removeTestAtIndex(index) # Green's subprocesses have handled all actual tests and sent up the # result, but unittest expects to be able to add teardown errors to # the result still, so we'll need to watch for that ourself. errors_before = len(result.errors) if topLevel: self._tearDownPreviousClass(None, result) self._handleModuleTearDown(result) result._testRunEntered = False # Special handling for class/module tear-down errors. startTest() and # finalize() both trigger communication between the subprocess and # the runner process. addError() if errors_before != len(result.errors): difference = len(result.errors) - errors_before result.errors, new_errors = ( result.errors[:-difference], result.errors[-difference:], ) for (test, err) in new_errors: # test = ProtoTest() test.module = result._previousTestClass.__module__ test.class_name = result._previousTestClass.__name__ # test.method_name = 'some method name' test.is_class_or_module_teardown_error = True test.name = "Error in class or module teardown" # test.docstr_part = 'docstr part' # error_holder.description result.startTest(test) result.addError(test, err) result.stopTest(test) result.finalize() return result
def _collect(suite): for test in suite: if _isnotsuite(test): new_suite.addTest(test) elif test.countTestCases() > 0: _collect(test)