python retry with retrying,为unittest禁用

时间:2019-06-19 01:29:36

标签: python mocking python-unittest

编辑:由于韧度是最近的重试方法,因此可以将该问题视为链接问题的重复,而解决方案是升级为韧度。

类似于this question,我想对python中具有重试装饰器的函数进行单元测试:

from retrying import retry # from retrying pypi module

WAIT_EXPONENTIAL_MULTIPLIER = 4 * 1000  # ms
STOP_MAX_ATTEMPT_NUMBER = 5

@retry(
   wait_exponential_multiplier=WAIT_EXPONENTIAL_MULTIPLIER,
   stop_max_attempt_number=STOP_MAX_ATTEMPT_NUMBER
)
def get_from_remote(key):
    raise ValueError() # for example

在单元测试中,我想有时不完全重试而有时用不同的参数来调用此函数。

我尝试在setUp()/tearDown()中设置变量,但是没有用。我尝试修补重试装饰器,但也没有用。

1 个答案:

答案 0 :(得分:0)

由于行

不确定是否可行
Retrying(*dargs, **dkw).call(f, *args, **kw)
retrying

Retrying实例是在函数运行时即时创建的,无法再更改其属性。

一种方法可能是保留未修饰的对 在运行时发挥作用并装饰老式玩具。

from retrying import retry

WAIT_EXPONENTIAL_MULTIPLIER = 1 * 1000  # ms

# the "normal" decorator
retry_dec = retry(wait_exponential_multiplier=WAIT_EXPONENTIAL_MULTIPLIER)

# the undecorated function
def get_from_remote_undecorated(key):
    raise ValueError()

# this is the "normal" decorated function
get_from_remote = retry_dec(get_from_remote_undecorated)

这可以在单元测试中重复:

# some test
retry_dec_test_1 = retry(wait_exponential_multiplier=WAIT_EXPONENTIAL_MULTIPLIER)
get_from_remote_test_1 = retry_dec_test_1(get_from_remote_undecorated)

# another test with different parameters
retry_dec_test_2 = retry(stop_max_attempt_number=STOP_MAX_ATTEMPT_NUMBER)
get_from_remote_test_2 = retry_dec_test_2 (get_from_remote_undecorated)

但是我对这种方法并不十分满意,并将尝试找到更好的解决方案。