用Python编写一个可恢复的循环
我有一个具有以下结构的测试:用Python编写一个可恢复的循环,python,Python,我有一个具有以下结构的测试: def test_foo(测试用例): 对于测试案例中的案例: 运行测试(案例) 每个run\u测试都相当慢,如果案例失败,再次调用测试将从头开始循环 因此,我将跟踪状态文件中最后一个失败的循环变量,如下所示: def test_foo(测试用例、状态文件): 状态dic=加载状态文件(状态文件) 对于itertools.dropwhile中的情况( lambda c:state_dic中的“foo”和state_dic[“foo”!=c, 测试用例): 州_di
def test_foo(测试用例):
对于测试案例中的案例:
运行测试(案例)
每个run\u测试都相当慢,如果案例失败,再次调用测试将从头开始循环
因此,我将跟踪状态文件中最后一个失败的循环变量,如下所示:
def test_foo(测试用例、状态文件):
状态dic=加载状态文件(状态文件)
对于itertools.dropwhile中的情况(
lambda c:state_dic中的“foo”和state_dic[“foo”!=c,
测试用例):
州_dic['foo']=案例
尝试:
运行测试(案例)
除例外情况外:
保存状态文件(状态dic,状态文件)
提升
州/地区流行语('foo',无)
保存状态文件(状态dic,状态文件)
我想知道是否有更通用的方法来实现从状态循环恢复。到目前为止,我得出的结论是:
def test_foo(测试用例、状态文件):
使用ResumableIterator(测试用例“foo”,状态文件)作为小写:
对于大小写:
运行测试(案例)
其中,ResumableIterator
是一个上下文管理器,它将跟踪状态'foo'
从/到状态文件的加载和保存。它将生成一个由第一个参数构造的迭代器,该迭代器跟踪它发出的最后一个值,以便在循环异常发生时,它将最后发出的值保存在状态文件中。有更好的想法吗?不确定这是否比您的上下文管理器方法更好,但它可能更简单,只需运行一次
,而不是\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu进入和(通常很无聊的)
# python 3
class TestRunner:
def __init__(self, *test_cases):
self.queue = list(test_cases)
def run(self):
for i, case in enumerate(self.queue):
try:
run_test(case)
except Exception as e:
print(e)
self.queue = self.queue[i:]
break
为了演示的目的,让我们假设
def run_test(case):
case()
runner = TestRunner(
lambda: print('case 1'),
lambda: print('case 2'),
lambda: print(im_not_defined),
lambda: print('case 4')
)
然后您只需调用run
方法来运行测试:
>>> runner.run()
case 1
case 2
name 'im_not_defined' is not defined
>>> runner.run() # resume from last failure; will fail again since we didn't fix it
name 'im_not_defined' is not defined
>>> runner.queue[0] = lambda: print('case 3 fixed')
>>> runner.run()
case 3 fixed
case 4
不确定这是否比您的上下文管理器方法更好,但它可能更简单,只运行一次
,而不是\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
# python 3
class TestRunner:
def __init__(self, *test_cases):
self.queue = list(test_cases)
def run(self):
for i, case in enumerate(self.queue):
try:
run_test(case)
except Exception as e:
print(e)
self.queue = self.queue[i:]
break
为了演示的目的,让我们假设
def run_test(case):
case()
runner = TestRunner(
lambda: print('case 1'),
lambda: print('case 2'),
lambda: print(im_not_defined),
lambda: print('case 4')
)
然后您只需调用run
方法来运行测试:
>>> runner.run()
case 1
case 2
name 'im_not_defined' is not defined
>>> runner.run() # resume from last failure; will fail again since we didn't fix it
name 'im_not_defined' is not defined
>>> runner.queue[0] = lambda: print('case 3 fixed')
>>> runner.run()
case 3 fixed
case 4
这可能是一份合作项目的工作吗?你考虑过这些吗?你不能只产生?你不能只使用一个片段吗<代码>对于测试中的案例\u案例[lastcase+1://code>从下一个案例开始?即使其中一个失败,也不可能继续运行其余的测试吗?我想,试一下,除了你所需要的。既然你想从失败的测试中恢复,我认为没有依赖性问题。再加上@gill的观点:你可以返回失败测试的列表,并将它们传递给下一个test_foo调用。这是一个协同程序的作业吗?你考虑过这些吗?你不能只产生?你不能只使用一个片段吗<代码>对于测试中的案例\u案例[lastcase+1://code>从下一个案例开始?即使其中一个失败,也不可能继续运行其余的测试吗?我想,试一下,除了你所需要的。既然你想从失败的测试中恢复,我认为没有依赖性问题。再加上@gill的观点:你可以返回失败测试的列表,并将它们传递给下一个test_foo调用。