有没有一种在Python脚本中注入失败的简洁方法?我希望避免在源代码中洒上如下内容:
failure_ABC = True
failure_XYZ = True
def inject_failure_ABC():
raise Exception('ha! a fake error')
def inject_failure_XYZ():
# delete some critical file
pass
# some real code
if failure_ABC:
inject_failure_ABC()
# some more real code
if failure_XYZ:
inject_failure_XYZ()
# even more real code
编辑:我有以下想法:插入“故障点”作为巧尽心思构建的注释。编写一个简单的解析器,在Python解释器之前调用,并使用实际的失败代码生成实际的插装Python脚本。例如:
#!/usr/bin/parser_script_producing_actual_code_and_calls python
# some real code
# FAIL_123
if foo():
# FAIL_ABC
execute_some_real_code()
else:
# FAIL_XYZ
execute_some_other_real_code()
脚本将以FAIL_
开头的任何内容视为故障点,并根据配置文件启用/禁用故障。你认为如何?
发布于 2013-01-10 10:27:27
在测试错误处理时,最好的方法是隔离可以在新方法中抛出错误的代码,您可以在测试中重写这些代码:
class ToTest:
def foo(...):
try:
self.bar() # We want to test the error handling in foo()
except:
....
def bar(self):
... production code ...
在测试用例中,可以使用抛出要测试的异常的代码扩展ToTest
和重写bar()
。
编辑您确实应该考虑将大型方法拆分为较小的方法。它将使代码更易于测试、理解和维护。看看测试驱动开发,了解如何更改您的开发过程的一些想法。
关于你使用“失败评论”的想法。这看起来是个很好的解决方案。有一个小问题:您必须编写自己的Python解析器,因为Python在生成字节码时不保留注释。
因此,您可以用几周的时间编写这篇文章,也可以用几周的时间让您的代码更容易测试。
但是,有一个不同之处:如果您不一路走下去,解析器将毫无用处。而且,所花费的时间也不会改善您的代码。大部分工作将投入到解析器和工具中。因此,在所有这些时间之后,您仍然需要改进代码,添加失败注释并编写测试。
通过重构代码,您可以随时停止,但是到目前为止所花费的时间是有意义的,而不是浪费的。您的代码将开始变得更好,随着您进行的第一次更改,它将不断改进。
编写一个复杂的工具需要时间,而且它会有自己的bug,需要修复或解决。所有这些都不会在短期内改善你的处境,而且你也无法保证它会改善你的长期状况。
发布于 2013-01-10 10:24:16
如果您只想在某个时候停止您的代码,然后返回到交互式解释器,您可以使用:
assert 1==0
但是,只有在不使用-O运行python的情况下,这才有效。
编辑实际上,我的第一个答案是快速,没有真正理解你想做什么,对不起。
如果您通过参数(而不是通过变量/函数)进行参数化,您的代码可能已经变得更加可读性了。有点像
failure = {"ABC": False, "XYZ":False}
#Do something, maybe set failure
def inject_failure(failure):
if not any(failure.values()):
return
if failure["ABC"]:
raise Exception('ha! a fake error')
elif failure["XYZ"]:
# delete some critical file
pass
inject_failure(failure)
https://stackoverflow.com/questions/14255569
复制相似问题