点击此处查看详细分析解答
iTestSmart测试用例失败问题分析:AttributeError: 'NoneType' object has no attribute 'find'
根据您提供的测试日志和错误信息,以下是对 iTestSmart x.40 执行 PlatformFunctions_network_IPversion_0001 测试用例失败 的详细分析。
一、问题概述
二、日志关键信息解析
从提供的日志来看,测试流程如下:
-
成功访问 Redfish 接口获取以太网接口列表:
GET https://192.168.41.228/redfish/v1/Managers/1/EthernetInterfaces
→ 返回 Members 中包含接口 '/redfish/v1/Managers/1/EthernetInterfaces/60537515b182'
-
成功获取指定 EthernetInterface 的详细信息:
GET https://192.168.41.228/redfish/v1/Managers/1/EthernetInterfaces/60537515b182
→ 成功返回状态码 200,说明 Redfish 接口正常可访问
-
下发命令获取当前 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"
}
}
}
}
-
最终报错:
AttributeError: 'NoneType' object has no attribute 'find'
这表明在脚本中对一个 None 值调用了 .find() 方法,通常该方法用于字符串或 XML/HTML 文档查找(如 response.find("key")),说明某个预期返回非空的对象为空。
三、根本原因分析
结合知识库信息和报错上下文,可能原因包括:
1. Redfish 接口返回字段结构异常或缺失
虽然 Redfish 接口返回了 200 响应,但返回的 JSON 数据中可能缺少某些预期字段,导致后续解析时为 None。
例如,在测试脚本中可能执行了类似操作:
data = redfish_get(url)
target_field = data.get("SomeProperty")
result = target_field.find("substring") # 如果 SomeProperty 为 None,则触发错误
问题:尽管接口可用,但 EthernetInterface 的响应体中某些字段未按脚本预期存在(比如 Description、Name、Oem 等字段为 null),而脚本未做空值判断。
验证建议:使用 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.ElementTree 或 BeautifulSoup 解析响应文本,但原始响应为 None 或非字符串;
- 调用了
str.find(),但变量是 None 类型;
- 在返回的
self._cache_data 中提取某个字段时未校验是否存在。
知识库中提到类似问题:
“AttributeError: 'NoneType' object has no attribute 'find' 表明测试脚本未能获取所需对象” —— 来自文档 1
3. 权限限制导致部分字段为空
测试用例描述为:“仅有常规配置权限的自定义用户”。Redfish 接口可能对不同用户角色返回不同级别的响应内容。
- 普通用户请求
/EthernetInterfaces 接口时,某些敏感字段(如 DNS 配置、OEM 扩展属性)可能被过滤或设为 null;
- 若脚本依赖这些字段进行
.find() 操作(如查找 "DNS" 字符串),就会因 None 触发异常。
虽然 HTTP 返回 200,但响应体中的关键字段缺失或为空,是典型的权限控制副作用。
4. 网络配置状态不一致或缓存问题
虽然日志显示已获取 IP 地址、掩码等信息,但如果 BMC 的 bmc_network 组件未完全加载或处于中间状态,可能导致部分接口查询返回不完整数据。
知识库中提及:
bmc_network 是负责 IPv4/IPv6 配置的核心闭源组件……旧版本不支持 link 状态变化后重新通过 DHCP 获取 IP 地址。
若 bmc_network 组件在测试开始时尚未完成初始化,可能导致某些查询返回空值。
四、解决方案建议
1. 检查并验证 Redfish 接口返回值完整性
使用 Postman 或 curl 工具,以相同用户身份发送请求:
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,则报错
...
改进写法:
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)确认是否存在已知问题及修复补丁;
- 提交日志文件用于排查。
五、总结
| 项目 |
分析结论 |
| 错误类型 |
AttributeError: 'NoneType' object has no attribute 'find' |
| 根本原因 |
测试脚本尝试在一个 None 值上调用 .find() 方法 |
| 主要原因 |
1. Redfish 接口返回字段缺失或为 null 2. 测试脚本未做空值校验 3. 普通用户权限导致响应裁剪 4. bmc_network 组件功能限制 |
| 是否为环境/BMC 配置问题 |
有可能,特别是在组件版本低或权限控制严格时 |
建议行动清单
- 使用 Postman 验证 Redfish 接口返回值完整性
- 检查测试脚本中
.find() 调用前是否进行了空值判断
- 对比管理员 vs 普通用户访问接口的响应差异
- 确认
bmc_network 组件版本 ≥ 1.70.1
- 升级 iTestSmart 或联系工具团队获取修复方案
如问题持续存在,建议在 openUBMC 社区 提交完整日志请求官方支持。