目录
1.背景
在略微复杂一些的自动化测试脚本中,都会使用“超时”处理。因为采用eventlet进行超时处理,所以有了这一次的经验教训。代码是网上抄的,问题是自己找的。。。
2.问题重现
使用了网上一段超时代码,出处已经无从知晓了,在此向作者抱个歉了~~
import time
import eventlet
TIMEOUT=100
eventlet.monkey_patch()
try:
with eventlet.Timeout(TIMEOUT):
while True:
act = foo(param1, param2)
if act == exp:
return True
time.sleep(5)
except eventlet.timeout.Timeout:
print('程序运行超时!')
在超时时间较短,模块调用不复杂的情况下,代码不会有出现问题。只是在自己用的自动化框架中,模块较多,调用关系复杂,加之创建资源等待时间较长(超过3min。这个是产品自身属性)。所以出现了,单个用例运行正常,多个用例一起执行时就会抛出如下异常:
RuntimeError: maximum recursion depth exceeded
超过递归调用深度。虽然可以手动临时修改,但毕竟不能从根本上解决问题。
3.问题解决
1)重写超时
简单但没有再出错的代码:
TIMEOUT = 100
def timeout_func(TIMEOUT, act, exp):
cnt = 1
while cnt <= TIMEOUT:
if act == exp:
break
time.sleep(5)
cnt = cnt + 1
if cnt > TIMEOUT:
raise Exception(f"超时了~~")
2)对eventlet回退版本
这个如参考资料所示。但由于Python版本非资料中说的3.6,所以这个方法没有考虑。留给各位看官实践吧~~