def wait_for_match(self, message, obj, prop_name, expected, timeout=10, interval=0.5): '''每隔interval检查obj.prop_name是否和正则表达式expected是否匹配,如果在timeout时间内都不相等,则测试用例失败 :param message: 失败时的输出信息 :param obj: 需要检查的对象 :type prop_name: string :param prop_name: 需要检查的对象的属性名, obj.prop_name返回字符串 :param expected: 需要匹配的正则表达式 :param timeout: 超时秒数 :param interval: 重试间隔秒数 :return: True or False ''' for _ in Retry(timeout=timeout, interval=interval, raise_error=False): actual = getattr(obj, prop_name) if re.match(expected, actual, re.I): return True else: self.__record_assert_failed(message, getattr(obj, prop_name), expected) return False
def wait_for_equal(self, message, obj, prop_name, expected, timeout=10, interval=0.5): '''每隔interval检查obj.prop_name是否和expected相等,如果在timeout时间内都不相等,则测试用例失败 :param message: 失败时的输出信息 :param obj: 需要检查的对象 :type prop_name: string :param prop_name: 需要检查的对象的属性名,支持多层属性 :param expected: 期望的obj.prop_name值 :param timeout: 超时秒数 :param interval: 重试间隔秒数 :return: True or False ''' for _ in Retry(timeout=timeout, interval=interval, raise_error=False): actual = getattr(obj, prop_name) if actual == expected: return True else: self.__record_assert_failed(message, getattr(obj, prop_name), expected) return False
def _wait_driver_ready(self): for _ in Retry(timeout=5): try: driver = self.get_driver() driver.hello() break except: pass
def run_test(self): self.start_step('step 1') self.assert_('测试__string_combain函数', self.string_combain('x', 'y') == 'xy') self.start_step('step 2') # self.assert_('测试失败', False) self.start_step('step 3') for item in Retry(timeout=2, interval=0.5): print('start to retry...') self.a += 1 if self.a > 2: print('a', self.a) break
def test_retry_with_timeout(self): def dummy(toggle_time, start_ts): if time.time() - start_ts > toggle_time: return True interval = 1 timeout = 5 retry = Retry(interval=interval, timeout=timeout) self.assertRaises(ValueError, retry.call, None) start_time = time.time() try: retry.call(dummy, timeout + 1, start_time) except RetryLimitExcceeded: time_cost = time.time() - start_time self.assertGreaterEqual( time_cost, 5, "actual timeout=%s is less than specified timeout=%s" % (time_cost, timeout)) else: self.fail("no RetryLimitExcceeded raised") start_time = time.time() count = 0 retry = Retry(interval=interval, timeout=timeout) for retry_item in retry: count += 1 self.assertEqual(count, retry_item.iteration, "iteration does not match") if dummy(2, start_time): time_cost = time.time() - start_time self.assertGreaterEqual( time_cost, 2, "actual interval=%s is less than specified interval=%s" % (time_cost / float(count), interval)) break else: self.fail("unexpected timeout")
def test_retry_with_count(self): def dummy(param): param[0] += 1 if param[0] > 2: return True retry = Retry(limit=1) self.assertRaises(ValueError, retry.call, None) x = [0] try: retry.call(dummy, x) except RetryLimitExcceeded: pass else: self.fail("no RetryLimitExcceeded was raised") x = [0] retry = Retry(limit=3) try: retry.call(dummy, x) except RetryLimitExcceeded: self.fail("RetryLimitExcceeded was raised") x = [0] retry = Retry(limit=3, interval=None) retry_count = 0 start_time = time.time() for retry_item in retry: retry_count += 1 self.assertEqual(retry_count, retry_item.iteration, "iteration does not match") if dummy(x): self.assertEqual(retry_count, 3, "iteration does not match") break time_cost = time.time() - start_time self.assertLess(time_cost, 0.05, "interval is unexpected") x = [-5] limit = 3 retry = Retry(limit=limit, interval=0.5, raise_error=False) start_time = time.time() retry.call(dummy, x) time_cost = time.time() - start_time self.assertGreaterEqual(time_cost + 0.1, (limit - 1) * 0.5, "interval has no effect.")
import form as form from testbase.retry import Retry from testbase.testcase import TestCase def string_combine(param, param1): return param + param1 class StrCombineTest(TestCase): '''测试字符串拼接接口 ''' owner = "foo" status = TestCase.EnumStatus.Ready priority = TestCase.EnumPriority.Normal timeout = 1 def run_test(self): # --------------------------- self.start_step("测试字符串拼接") # --------------------------- result = string_combine("xxX", "yy") self.assert_("检查string_combine调用结果", result == "xxXyy9") if __name__ == '__main__': for w in Retry(timeout=2, interval=0.5, raise_error=False): print(w) # StrCombineTest().debug_run()