【发布时间】:2023-03-29 14:08:01
【问题描述】:
如何测试我的程序对意外关闭的鲁棒性?
我的 Python 代码将在意外关闭的微控制器上运行。我想测试代码的每个部分意外重启并验证它是否正确处理。
尝试: 我尝试将代码放入它自己的进程中,然后提前终止它,但这不起作用,因为 MyClass 从命令行调用 7zip,即使在进程终止后也会继续:
import multiprocessing
import os
def MyClass(multiprocessing.Process):
...
def run():
os.system("7z a myfile.7z myfile")
process = MyClass()
process.start()
time.sleep(4)
print("terminating early")
process.terminate()
print("done")
我想要什么:
class TestMyClass(unittest.TestCase):
def test_MyClass_continuity(self):
myclass = MyClass().start()
myclass.kill_everything()
myclass = MyClass().start()
self.assert_everything_worked_as_expected()
有没有简单的方法来做到这一点?如果没有,你如何设计可以在任何时候终止的健壮代码(例如测试状态机)?
类似问题(截至 21 年 10 月 26 日仍未得到答复):Simulating abnormal termination in pytest
非常感谢!
【问题讨论】:
-
您的第一个代码示例有一些语法错误,但除此之外,不要将您要在 init 中运行的子进程中运行的代码放在主进程中过程。虽然正确的行为应该是阻止而不是后台运行,但您确定它在后台运行吗?
-
谢谢,你是对的,现在更新了 - 代码应该在自己的进程中运行(在 run 函数中定义),而不是在 init.
-
可以process groups在这里帮忙吗?
-
微控制器或微处理器之类的树莓派?
-
idk 关于 pytest,但我会采取的方法是查看每个系统调用(主要是打开的文件/附加的硬件),并确保您处理它可能返回的每种类型的错误。目录不存在:创建它。未附加串行设备:等待附加事件。等等……
标签: python error-handling multiprocessing pytest microcontroller