首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python故障注入

Python故障注入
EN

Stack Overflow用户
提问于 2013-01-10 10:20:18
回答 2查看 1.5K关注 0票数 5

有没有一种在Python脚本中注入失败的简洁方法?我希望避免在源代码中洒上如下内容:

代码语言:javascript
运行
复制
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脚本。例如:

代码语言:javascript
运行
复制
#!/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_开头的任何内容视为故障点,并根据配置文件启用/禁用故障。你认为如何?

EN

回答 2

Stack Overflow用户

发布于 2013-01-10 10:27:27

在测试错误处理时,最好的方法是隔离可以在新方法中抛出错误的代码,您可以在测试中重写这些代码:

代码语言:javascript
运行
复制
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,需要修复或解决。所有这些都不会在短期内改善你的处境,而且你也无法保证它会改善你的长期状况。

票数 3
EN

Stack Overflow用户

发布于 2013-01-10 10:24:16

如果您只想在某个时候停止您的代码,然后返回到交互式解释器,您可以使用:

代码语言:javascript
运行
复制
assert 1==0

但是,只有在不使用-O运行python的情况下,这才有效。

编辑实际上,我的第一个答案是快速,没有真正理解你想做什么,对不起。

如果您通过参数(而不是通过变量/函数)进行参数化,您的代码可能已经变得更加可读性了。有点像

代码语言:javascript
运行
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14255569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档