ARTICLE DETAIL

资讯详情

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

LDAP部分测试用例解读

LDAP部分测试用例解读 Verify Local Admin User Creation When LDAP Is UnreachableLDAP 服务不可用不应该阻止 BMC 管理员创建和使用本地 Administrator 账户。它实际上是在验证一种故障隔离 / fallback 行为┌── LDAP 正常 → LDAP 用户认证 BMC 认证系统 ────┤ └── LDAP 不可达 → 本地用户仍然可用因此这个测试非常有价值因为如果 BMC 把 LDAP 当成唯一认证来源那么 LDAP 一旦宕机管理员可能连本地账号都无法正常使用最终可能失去 BMC 管理能力。Create LDAP Config With Various Port Numbers这个用例拿出来不是因为测试失败了而是说这个测试用例其实对输入ldap服务器的url是有约束的不能带端口而且本身对末尾的/处理逻辑有些问题。问题描述Create LDAP Config With Various Port Numbers用于验证 LDAP Server URI 中不同 Port 值的处理当前测试数据为# port_value expected_status 99999 ${HTTP_BAD_REQUEST} invalid_port ${HTTP_BAD_REQUEST} #$% ${HTTP_BAD_REQUEST} -1 ${HTTP_BAD_REQUEST} ${EMPTY} ${HTTP_OK}, ${HTTP_NO_CONTENT}测试设计上希望验证非法 Port → 400 Empty Port → 200/204调试发现当前实现存在一个实际的 URI 处理问题。此外在增加合法 Port 测试覆盖时还需要考虑基础 URI 中已经存在 Port 的情况。1.rstrip(/)没有被正确执行导致现有测试结果失真Create LDAP Config With Port And Verify当前使用VAR ${base_uri} ${LDAP_SERVER_URI}.rstrip(/) evaluateTrue该代码的目的是去除${LDAP_SERVER_URI}末尾的/。复现步骤使用一个不带显式 Port、但以/结尾的基础 URILDAP_SERVER_URIldaps://192.168.20.103/执行原有的${EMPTY}测试port_value${EMPTY} expected_status${HTTP_OK}, ${HTTP_NO_CONTENT}${EMPTY}的预期行为是不增加 Port因此最终 URI 应为ldaps://192.168.20.103但实际 Robot 日志显示LDAP_SERVER_URIldaps://192.168.20.103/ base_urildaps://192.168.20.103/.rstrip(/) evaluateTrue ldap_uri_with_portldaps://192.168.20.103/.rstrip(/) evaluateTrue可以看到rstrip(/)并没有被执行而是整个表达式被作为普通字符串保存。因此实际生成的请求中ServiceAddresses包含了错误的 URIBODY{ LDAP: { ServiceEnabled: True, ServiceAddresses: [ ldaps://192.168.20.103/.rstrip(/) evaluateTrue ], ... } }随后通过浏览器 WebUI 使用相同参数进行验证。F12 抓包确认该错误 URI 被实际发送到 BMC并返回400 Bad Request而 Robot 侧记录TypeError from redfish_plus class但测试最终仍显示Create LDAP Config With Various Port Numbers | PASS |因此原有${EMPTY}测试并没有可靠地验证其预期结果${EMPTY} → 200/204错误的 URI 构造以及后续客户端侧异常处理掩盖了真实 HTTP 结果导致测试可能出现假通过。2. 增加合法 Port 测试时需要考虑基础 URI 已包含 Port 的情况修复rstrip(/)后当${LDAP_SERVER_URI}不包含显式 Port 时当前测试逻辑可以正常工作例如LDAP_SERVER_URIldaps://192.168.20.103或者LDAP_SERVER_URIldaps://192.168.20.103/例如port_value389可以正确生成ldaps://192.168.20.103:389并返回200/204。为了完整覆盖 Port 校验也建议增加合法 Port389 ${HTTP_OK}, ${HTTP_NO_CONTENT} 636 ${HTTP_OK}, ${HTTP_NO_CONTENT}这样测试可以覆盖合法 Port → 200/204 非法 Port → 400 Empty Port → 200/204但是${LDAP_SERVER_URI}本身也可能是一个合法的、已经包含 Port 的 URI例如ldap://192.168.20.103 ldap://192.168.20.103/ ldap://192.168.20.103:389 ldap://192.168.20.103:389/ ldaps://192.168.20.103 ldaps://192.168.20.103/ ldaps://192.168.20.103:636 ldaps://192.168.20.103:636/这些 URI 本身都可以正常使用。如果LDAP_SERVER_URIldaps://192.168.20.103:636测试port_value389当前关键字会直接在原 URI 后追加 Port得到ldaps://192.168.20.103:636:389BMC 返回status: 400 valid_status_codes: [0]: 200 [1]: 204此时389本身是合法 Port但测试仍然失败。对于非法 Port例如port_value99999同样会受到原有 Port 的影响因此即使返回400也无法明确证明是99999本身非法导致的。需要注意的是这并不意味着带 Port 的${LDAP_SERVER_URI}是错误的。问题仅在于当前测试关键字会直接将新的port_value追加到原始 URI。两种处理方案方案一最小修改保留现有测试逻辑和测试数据。只修复rstrip(/)的处理并在关键字中明确注释# Build LDAP URI with the specified port. # LDAP_SERVER_URI should not contain an explicit port.也就是说${LDAP_SERVER_URI}应使用不带显式 Port 的合法 LDAP/LDAPS URI例如ldap://IP ldap://IP/ ldaps://IP ldaps://IP/该方案不增加389和636的合法 Port 测试。优点修改最小不改变当前测试设计风险较低。缺点测试依赖环境提供不带 Port 的${LDAP_SERVER_URI}无法在这种实现下可靠增加389、636等合法 Port 测试。方案二增强 URI 处理除修复rstrip(/)外进一步修改 URI 构造逻辑使关键字在应用当前port_value前先处理${LDAP_SERVER_URI}中已有的 Port。例如${url} Evaluate urllib.parse.urlsplit($LDAP_SERVER_URI) modulesurllib.parse ${base_uri} Set Variable ${url.scheme}://${url.hostname}然后继续使用现有的is_empty逻辑。这样无论环境提供以下哪种基础 URIldap://192.168.20.103 ldap://192.168.20.103/ ldap://192.168.20.103:389 ldap://192.168.20.103:389/ ldaps://192.168.20.103 ldaps://192.168.20.103/ ldaps://192.168.20.103:636 ldaps://192.168.20.103:636/都可以先得到不带 Port、也不带末尾/的基础 URI再由当前port_value决定最终 Port。同时增加389 ${HTTP_OK}, ${HTTP_NO_CONTENT} 636 ${HTTP_OK}, ${HTTP_NO_CONTENT}这样可以真正覆盖合法 Port → 200/204 非法 Port → 400 Empty Port → 200/204从测试健壮性的角度方案二更推荐因为测试不会依赖外部环境中的${LDAP_SERVER_URI}是否带 Port。建议必须修复rstrip(/)的处理确保表达式真正执行避免错误 URI 导致测试结果失真和假通过。建议增加合法 Port389和636的测试以完整覆盖合法、非法以及 Empty Port 的场景。对基础 URI 已经包含 Port 的情况优先建议采用方案二使测试逻辑与环境提供的 URI 格式解耦。如果暂时保持当前 URI 构造逻辑则至少采用方案一在关键字注释中明确${LDAP_SERVER_URI}不应包含显式 Port避免新增合法 Port 测试时产生误导性的失败。
返回列表