# PR #38244 完整报告

- 仓库：`sgl-project/sglang`
- 标题：[CPU] use CustomTestCase for registered CPU tests
- 合并时间：2026-09-07 15:09
- 原文链接：http://prhub.com.cn/sgl-project/sglang/pull/38244

---

# 执行摘要

- 一句话：将 4 个已注册 CPU 测试文件从 `unittest.TestCase` 迁移至 `CustomTestCase`，防止 `setUpClass` 失败时资源泄漏。
- 推荐动作：这是一个简单、低风险的维护性 PR，旨在统一测试基类以利用 `CustomTestCase` 提供的更好生命周期保证。对于关注测试健壮性和 CI 稳定性的工程师，建议精读，以理解 `CustomTestCase` 的作用。对于大多数开发者，这是一个可以直接 approve 的小改动。

# 功能与动机

根据 PR body，本次变更的动机是“更新已注册的 CPU 测试以使用 `CustomTestCase` 而非原始的 `unittest.TestCase`。这保留了测试生命周期保证，即即使 `setUpClass` 失败，`tearDownClass` 也会运行，从而防止 CI 中的资源泄漏”。这是一个针对测试健壮性的防御性改进。

# 实现拆解

1. **变更入口与范围**：变更仅限于 `test/registered/cpu/` 目录下的 4 个测试文件，是一个纯测试基类的统一替换。
2. **核心逻辑改造**：在每个测试文件中，通过新增或调整导入语句，将基类从 `unittest.TestCase` 替换为 `CustomTestCase`。例如，在 `test_server_args_backend.py` 中新增 `from sglang.test.test_utils import CustomTestCase` 并将两个测试类 `TestServerArgsCPUBackend` 和 `TestServerArgsIBDeviceValidation` 的基类改为 `CustomTestCase`。其他三个文件的修改模式完全相同。
3. **测试配套**：此变更本身就是对测试代码的修正。所有测试的断言和逻辑保持不变，确保现有功能覆盖不受影响。
4. **配置与部署**：无相关改动。

关键文件：
- `test/registered/cpu/test_server_args_backend.py`（模块 CPU 后端测试；类别 test；类型 test-coverage；符号 TestServerArgsCPUBackend, TestServerArgsIBDeviceValidation）: 包含两个测试类，分别测试 CPU 后端参数默认值和 IB 设备验证逻辑，是本次变更中修改行数最多的文件。
- `test/registered/cpu/test_binding.py`（模块 线程绑定测试；类别 test；类型 test-coverage；符号 TestInitThreadsBinding）: 测试 NUMA 绑定功能，其基类替换逻辑与其他文件一致，但该文件在变更前已有一个类使用了 `CustomTestCase`。
- `test/registered/cpu/test_request_decompression.py`（模块 请求解压测试；类别 test；类型 test-coverage；符号 TestRequestDecompressionMiddleware）: 测试 HTTP 请求解压缩中间件，是本次变更的文件之一，修改模式标准。
- `test/registered/cpu/test_request_headers.py`（模块 请求头测试；类别 test；类型 test-coverage；符号 TestApplyRoutingHeaders）: 测试请求路由头部处理，是本次变更的文件之一，修改模式标准。

关键符号：TestServerArgsCPUBackend, TestServerArgsIBDeviceValidation, TestRequestDecompressionMiddleware, TestApplyRoutingHeaders, TestInitThreadsBinding

## 关键源码片段

### `test/registered/cpu/test_server_args_backend.py`

包含两个测试类，分别测试 CPU 后端参数默认值和 IB 设备验证逻辑，是本次变更中修改行数最多的文件。

```python
# 变更前
import unittest
# ...
class TestServerArgsCPUBackend(unittest.TestCase):
    # ...

class TestServerArgsIBDeviceValidation(unittest.TestCase):
    # ...

# 变更后
import unittest
from sglang.test.test_utils import CustomTestCase
# ...
class TestServerArgsCPUBackend(CustomTestCase):
    # ...

class TestServerArgsIBDeviceValidation(CustomTestCase):
    # ...

```
这是一个简单的基类替换。`CustomTestCase` 保证了即使 `setUpClass` 失败，`tearDownClass` 仍会执行，用于清理测试可能创建的临时文件或资源，防止 CI 环境资源泄漏。

### `test/registered/cpu/test_binding.py`

测试 NUMA 绑定功能，其基类替换逻辑与其他文件一致，但该文件在变更前已有一个类使用了 `CustomTestCase`。

```python
# 变更前
class TestInitThreadsBinding(unittest.TestCase):
    # ...

# 变更后
class TestInitThreadsBinding(CustomTestCase):
    # ...

```
此变更将测试 NUMA 线程绑定功能的 `TestInitThreadsBinding` 类基类统一为 `CustomTestCase`，使其在 `setUpClass` 失败时也能可靠执行 `tearDownClass` 进行资源清理。

# 评论区精华

本 PR 无 review 讨论。

- 暂无高价值评论线程

# 风险与影响

- 风险：风险极低。变更仅涉及测试代码的基类替换，且 `CustomTestCase` 的行为被设计为 `unittest.TestCase` 的超集，不会改变现有测试的断言逻辑或执行路径。主要风险在于 `CustomTestCase` 本身的实现是否存在缺陷，但这属于仓库测试基础设施的范畴，而非本 PR 引入。
- 影响：影响范围很小，仅限于 4 个 CPU 测试文件。影响程度低，主要是提高了这些测试在 `setUpClass` 失败场景下的健壮性，防止 CI 资源泄漏。对用户无直接影响。对团队而言，这是一个维护性的改进，有助于保持 CI 环境的稳定。
- 风险标记：测试基础设施依赖

# 关联脉络

- 暂无明显关联 PR