You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pytest模拟完全重启 测试代码应对意外关机的健壮性

程序意外关机健壮性测试方案与代码设计

简单实现你需要的强制终止测试逻辑

你之前仅终止父进程的方案无效,是因为os.system调用创建的7zip属于独立子进程,父进程终止后会被系统托管继续运行,你需要将进程及其所有子孙进程一起强制销毁,才能模拟无清理的断电场景。

如果是Linux类环境的微控制器,可通过给工作进程设置独立进程组的方式实现,修改后的代码如下:

import multiprocessing
import os
import signal
import time
import unittest

class MyClass(multiprocessing.Process):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.group_id = None

    def run(self):
        # 给当前进程设置独立进程组,后续启动的所有子进程(包括7zip)都会归入该组
        os.setpgrp()
        self.group_id = os.getpgrp()
        # 原有业务逻辑
        os.system("7z a myfile.7z myfile")
    
    def kill_everything(self):
        if self.group_id:
            # 给整个进程组发强制终止信号,所有关联进程直接销毁,无任何清理逻辑,完全模拟断电效果
            os.killpg(self.group_id, signal.SIGKILL)

class TestMyClass(unittest.TestCase):
    def test_MyClass_continuity(self):
        # 第一次启动模拟运行
        myclass = MyClass()
        myclass.start()
        # 可调整等待时间,模拟在不同执行节点断电,也可以写循环跑多轮不同等待时间覆盖更多场景
        time.sleep(4)
        # 强制销毁所有相关进程
        myclass.kill_everything()
        myclass.join()
        # 第二次启动模拟重启后运行
        myclass = MyClass()
        myclass.start()
        myclass.join()
        # 补充你的断言逻辑,比如校验压缩包完整性、业务状态是否符合预期
        # self.assert_everything_worked_as_expected()

如果需要跨平台兼容,可以用psutil库递归杀所有子孙进程,无需处理进程组差异:

import psutil

def kill_everything(self):
    if self.pid:
        parent = psutil.Process(self.pid)
        # 递归杀所有子孙进程
        for child in parent.children(recursive=True):
            child.kill()
        parent.kill()

健壮可中断代码设计建议

  • 所有业务操作设计为幂等,重复执行不会产生异常结果,比如压缩文件时先写临时文件,校验完整后再原子替换目标文件,中断后重启直接删除未完成的临时文件重跑即可。
  • 关键执行节点做原子持久化,状态写入时先写临时文件,刷盘完成后再替换原有状态文件,避免中途断电导致状态文件损坏。程序每次启动优先读取持久化状态,从上次中断的节点继续执行,无需重复运行已完成的步骤。
  • 启动时增加数据校验逻辑,自动校验所有持久化文件、中间产物的完整性,损坏的文件直接清理重跑,避免基于异常数据执行业务逻辑。
  • 如需覆盖所有可能的中断点,可在业务代码的关键步骤前加测试钩子,测试阶段随机触发强制终止逻辑,多轮自动化运行即可覆盖绝大部分中断场景。

内容的提问来源于stack exchange,提问作者benjamin deworsop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:27:03