iTestSmart x.40: x_x_IPversion_0001 NoneType Error

一、测试环境
硬件:S920X20
BMC: 25.12
二、问题描述
“仅有常规配置权限的自定义用户设置网络协议测试”(PlatformFunctions_network_IPversion_0001)执行失败,报错信息如下。


根据报错信息,意思没能从Redfish的GET请求(url: https://192.168.41.228/redfish/v1/Managers/1/EthernetInterfaces/60537515b182)的返回值获取到想要的信息,所以报”NoneType"。请确认缺少什么信息,是不是测试环境和BMC配置问题。

答案内容由AI生成,仅供参考:

:puzzle_piece: 五、总结

项目 分析结论
错误类型 AttributeError: 'NoneType' object has no attribute 'find'
根本原因 测试脚本尝试在一个 None 值上调用 .find() 方法
主要原因 1. Redfish 接口返回字段缺失或为 null
2. 测试脚本未做空值校验
3. 普通用户权限导致响应裁剪
4. bmc_network 组件功能限制
是否为环境/BMC 配置问题 有可能,特别是在组件版本低或权限控制严格时
点击此处查看详细分析解答

iTestSmart测试用例失败问题分析:AttributeError: 'NoneType' object has no attribute 'find'

根据您提供的测试日志和错误信息,以下是对 iTestSmart x.40 执行 PlatformFunctions_network_IPversion_0001 测试用例失败 的详细分析。


:magnifying_glass_tilted_left: 一、问题概述

  • 测试用例PlatformFunctions_network_IPversion_0001(仅有常规配置权限的自定义用户设置网络协议测试)
  • 测试环境
    • 硬件平台:S920X20
    • BMC 版本:25.12
  • 错误类型
    AttributeError: 'NoneType' object has no attribute 'find'
    
    该错误出现在测试脚本执行过程中(PlatformFunctions_network_IPversion_0001.py line 73)。

:bar_chart: 二、日志关键信息解析

从提供的日志来看,测试流程如下:

  1. 成功访问 Redfish 接口获取以太网接口列表:

    GET https://192.168.41.228/redfish/v1/Managers/1/EthernetInterfaces
    → 返回 Members 中包含接口 '/redfish/v1/Managers/1/EthernetInterfaces/60537515b182'
    
  2. 成功获取指定 EthernetInterface 的详细信息:

    GET https://192.168.41.228/redfish/v1/Managers/1/EthernetInterfaces/60537515b182
    → 成功返回状态码 200,说明 Redfish 接口正常可访问
    
  3. 下发命令获取当前 IP 配置信息:

    Command Response: {
      "parser": {
        "blade": {
          "ip_info": {
            "ip_mode": "Static",
            "ipv4_address": "192.168.41.228",
            "ipv4_gateway": "192.168.41.254",
            "ipv4_mask": "255.255.255.0"
          }
        }
      }
    }
    
  4. 最终报错

    AttributeError: 'NoneType' object has no attribute 'find'
    

这表明在脚本中对一个 None 值调用了 .find() 方法,通常该方法用于字符串或 XML/HTML 文档查找(如 response.find("key")),说明某个预期返回非空的对象为空


:warning: 三、根本原因分析

结合知识库信息和报错上下文,可能原因包括:

1. Redfish 接口返回字段结构异常或缺失

虽然 Redfish 接口返回了 200 响应,但返回的 JSON 数据中可能缺少某些预期字段,导致后续解析时为 None

例如,在测试脚本中可能执行了类似操作:

data = redfish_get(url)
target_field = data.get("SomeProperty")
result = target_field.find("substring")  # 如果 SomeProperty 为 None,则触发错误

问题:尽管接口可用,但 EthernetInterface 的响应体中某些字段未按脚本预期存在(比如 DescriptionNameOem 等字段为 null),而脚本未做空值判断。

:white_check_mark: 验证建议:使用 Postman 或 curl 手动请求接口:

GET /redfish/v1/Managers/1/EthernetInterfaces/60537515b182

检查返回 JSON 是否包含所有预期字段,特别是脚本中 .find() 使用的目标字段(如 DNS、Mode、Protocol 等)。


2. 测试脚本初始化逻辑缺陷

错误堆栈显示:

AttributeError: 'NoneType' object has no attribute 'find'
File "...PlatformFunctions_network_IPversion_0001.py", line 73, in procedure

说明在 procedure() 函数第 73 行发生异常。该行很可能尝试在一个未正确初始化或解析失败的对象上调用 .find()

常见场景:

  • 使用 xml.etree.ElementTreeBeautifulSoup 解析响应文本,但原始响应为 None 或非字符串;
  • 调用了 str.find(),但变量是 None 类型;
  • 在返回的 self._cache_data 中提取某个字段时未校验是否存在。

:pushpin: 知识库中提到类似问题:

AttributeError: 'NoneType' object has no attribute 'find' 表明测试脚本未能获取所需对象” —— 来自文档 1


3. 权限限制导致部分字段为空

测试用例描述为:“仅有常规配置权限的自定义用户”。Redfish 接口可能对不同用户角色返回不同级别的响应内容

  • 普通用户请求 /EthernetInterfaces 接口时,某些敏感字段(如 DNS 配置、OEM 扩展属性)可能被过滤或设为 null
  • 若脚本依赖这些字段进行 .find() 操作(如查找 "DNS" 字符串),就会因 None 触发异常。

:locked_with_key: 虽然 HTTP 返回 200,但响应体中的关键字段缺失或为空,是典型的权限控制副作用


4. 网络配置状态不一致或缓存问题

虽然日志显示已获取 IP 地址、掩码等信息,但如果 BMC 的 bmc_network 组件未完全加载或处于中间状态,可能导致部分接口查询返回不完整数据。

:gear: 知识库中提及:

bmc_network 是负责 IPv4/IPv6 配置的核心闭源组件……旧版本不支持 link 状态变化后重新通过 DHCP 获取 IP 地址。

bmc_network 组件在测试开始时尚未完成初始化,可能导致某些查询返回空值。


:white_check_mark: 四、解决方案建议

1. 检查并验证 Redfish 接口返回值完整性

使用 Postmancurl 工具,以相同用户身份发送请求:

curl -k -u username:password https://192.168.41.228/redfish/v1/Managers/1/EthernetInterfaces/60537515b182

检查返回 JSON 是否包含以下字段:

  • Name
  • Description
  • IPv4Addresses
  • Oem
  • Links 或其他可能用于 .find() 的字符串字段

2. 审查测试脚本中的 .find() 调用

定位 PlatformFunctions_network_IPversion_0001.py 第 73 行附近代码,确认是否存在以下问题:

# ❌ 危险写法(缺乏判空)
data = response.get('SomeField')
if data.find('target') != -1:  # 若 data 为 None,则报错
    ...

:white_check_mark: 改进写法

data = response.get('SomeField')
if data is not None and isinstance(data, str) and data.find('target') != -1:
    ...

或使用更安全的字符串包含判断:

if data and 'target' in data:

3. 确认用户权限是否影响字段返回

对比以下两种请求的结果差异:

  • 使用 管理员账户 获取 /EthernetInterfaces/...
  • 使用 常规配置权限用户 获取

观察是否有字段缺失或为 null。若存在差异,则需在脚本中增加判空处理。


4. 升级或确认 bmc_network 组件版本

参考知识库建议:

检查 bmc_network 组件版本是否 ≥ 1.70.1,以确保 DHCP、DNS 等动态配置功能正常。

可执行以下命令查看组件版本:

ipcsrv_ctrl -v | grep bmc_network
# 或
ls /usr/lib/bmc_network*

如版本过低,请升级至支持完整网络管理功能的版本。


5. 联系 iTestSmart 工具维护团队

此问题可能已在新版本修复。建议:

  • 升级到 iTestSmart 1.0.40+ 更高版本;
  • 联系维护人员(如 Pae)确认是否存在已知问题及修复补丁;
  • 提交日志文件用于排查。

:puzzle_piece: 五、总结

项目 分析结论
错误类型 AttributeError: 'NoneType' object has no attribute 'find'
根本原因 测试脚本尝试在一个 None 值上调用 .find() 方法
主要原因 1. Redfish 接口返回字段缺失或为 null
2. 测试脚本未做空值校验
3. 普通用户权限导致响应裁剪
4. bmc_network 组件功能限制
是否为环境/BMC 配置问题 有可能,特别是在组件版本低或权限控制严格时

:white_check_mark: 建议行动清单

  1. 使用 Postman 验证 Redfish 接口返回值完整性
  2. 检查测试脚本中 .find() 调用前是否进行了空值判断
  3. 对比管理员 vs 普通用户访问接口的响应差异
  4. 确认 bmc_network 组件版本 ≥ 1.70.1
  5. 升级 iTestSmart 或联系工具团队获取修复方案

如问题持续存在,建议在 openUBMC 社区 提交完整日志请求官方支持。

这个也需要链接串口服务器执行