ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenBMC 自动化测试中的多进程陷阱:从 Execute Process 返回异常到 output.xml 损坏问题分析

OpenBMC 自动化测试中的多进程陷阱:从 Execute Process 返回异常到 output.xml 损坏问题分析 在 OpenBMC 测试自动化框架中Robot Framework经常被用于执行 BMC 功能测试、压力测试以及稳定性测试。为了提升测试效率openbmc-test-automation提供了基于 Python multiprocessing 的并发执行能力通过Execute Process同时启动多个测试任务对 BMC 的 REST、SSH、IPMI 服务进行压力验证。然而在实际使用过程中发现该多进程测试框架存在两个比较隐蔽的问题多进程执行结果返回异常导致测试结果误判测试执行成功但生成的 Robot Frameworkoutput.xml文件损坏。本文记录问题定位过程、根因分析以及最终解决方案。一、问题背景测试用例extended/test_bmc_stress_buster.robot该测试用于验证 BMC 在高并发访问下的稳定性。例如 IPMI stress 测试Stress BMC IPMI Server [Documentation] Execute maximum allowed IPMI operation. ${dict} Execute Process ... ${IPMI_BUSTER_MAX} ... IPMI Check Status Dictionary Should Not Contain Value ... ${dict} ... False其中IPMI_BUSTER_MAX控制并发数量Execute Process来自lib/jobs_processing.py它会创建多个 Python 子进程每个子进程执行 Robot keyword。整体流程Robot Test Case | v Execute Process | v jobs_processing.py | v multiprocessing.Process | v Robot Keyword Execution二、第一个问题Execute Process 返回结果异常1. 问题现象测试执行Stress BMC IPMI Server出现Stress BMC IPMI Server | FAIL | One or more IPMI operations has failed.但是实际观察 IPMI 操作命令可以正常执行BMC 有正常响应单独执行 keyword 可以成功。查看返回结果${dict} { 256555: False, 256557: False, 256559: False }最终导致Dictionary Should Not Contain Value ... ${dict} ... False失败。问题看起来像是 IPMI 执行失败但实际并不是。三、定位 jobs_processing.py继续检查lib/jobs_processing.py关键代码def execute_keyword(keyword_name, return_dict): pid os.getpid() status BuiltIn().run_keyword_and_return_status(keyword_name) return_dict[str(pid)] str(status)这里没有问题。子进程执行结果True / False可以正常写入。继续查看def execute_process(num_process, keyword_name): manager Manager() return_dict manager.dict() ... return return_dict问题出现在这里。四、Manager.dict() 与普通 dict 的区别Python multiprocessing 提供Manager()用于创建多个进程之间共享的数据。例如manager Manager() return_dict manager.dict()这个对象并不是普通 Python dictionary。它实际上是DictProxy Object结构类似Process A | Process B | Process C | v Manager Server | v Dict Proxy它通过 IPC进程间通信访问真实数据。因此return return_dict返回的是multiprocessing.managers.DictProxy而不是dict五、解决方案将返回值转换成普通 Python dictionary。修改- return return_dict return dict(return_dict)修改后def execute_process(num_process, keyword_name): manager Manager() return_dict manager.dict() ... return dict(return_dict)六、修改效果修改后返回{ 256555: True, 256557: True, 256559: True }Robot Framework 可以正常处理Dictionary Should Not Contain Value ... ${dict} ... False测试结果恢复正常。七、第二个问题output.xml 损坏修复返回结果问题后又发现另一个问题。这次测试本身PASS例如Stress BMC IPMI Server :: Execute maximum allowed IPMI operation. | PASS |但是测试结束后Robot Framework 无法解析output.xml错误[ ERROR ] Reading XML source output.xml failed: ParseError: XML or text declaration not at start of entity八、分析损坏的 output.xml打开output.xml发现文件中出现重复 XML 声明?xml version1.0 encodingUTF-8? robot ... ?xml version1.0 encodingUTF-8? robot正常 XMLXML declaration | v robot | v test cases而异常 XMLXML declaration | v robot | v XML declaration | v robot因此 XML parser 报错。九、为什么直接执行 ipmitool 没问题原测试Run IPMI Standard Command ... chassis status执行路径Robot keyword | Run IPMI Standard Command | IPMI library | ipmitool替换为${cmd} Catenate ... ipmitool ... chassis status Run And Return Rc And Output ... ${cmd}执行Robot | Shell | ipmitool测试通过IPMI 操作成功output.xml 正常。说明问题并不是 IPMI 命令本身。更可能与Robot keyword 调用方式多进程执行keyword 输出处理有关。十、Workaround将Run IPMI Standard Command ... chassis status替换IPMI Check Status ${cmd} Catenate ... ipmitool ... -I lanplus ... -C ${IPMI_CIPHER_LEVEL} ... -N 3 ... -p ${IPMI_PORT} ... -U ${OPENBMC_USERNAME} ... -P ${OPENBMC_PASSWORD} ... -H ${OPENBMC_HOST} ... chassis status ${rc} ${output} ... Run And Return Rc And Output ... ${cmd} Should Be Equal As Integers ... ${rc} ... 0十一、经验总结1. multiprocessing 返回对象要注意类型在 Python multiprocessing 中Manager().dict()不是dict而是DictProxy跨框架传递时最好转换dict(proxy)避免调用方无法正确处理。2. 自动化框架问题不一定来自测试目标本次问题初看像IPMI stress失败实际上第一个问题multiprocessing result handling第二个问题Robot output generation测试目标 BMC/IPMI 本身没有问题。3. PASS 不代表测试链路完整成功Robot Framework 流程Test Execution | v Generate output.xml | v Generate log/report任何一步失败都会影响 CI。因此Test PASS不一定代表Automation Pipeline PASS十二、总结本次 OpenBMC stress 测试问题最终发现两个独立问题问题位置解决方式Execute Process 返回结果异常jobs_processing.pyreturn dict(return_dict)output.xml 损坏Robot 执行链路使用直接 ipmitool workaround其中第一个问题已经通过代码修改解决第二个问题仍需要进一步分析 Robot Framework 多进程执行和输出处理机制。这类问题说明在复杂自动化测试框架中测试框架自身的稳定性与被测对象稳定性同样重要。
返回列表