# PRD - 性能测试模块读取系统配置的被测系统URL

> **文档版本**: v1.0
> **创建日期**: 2026-08-19
> **模块类型**: 性能测试
> **优先级**: P1

---

## 一、背景与目标

### 1.1 背景

当前平台已实现**系统管理 → 系统配置**页面，支持持久化配置被测系统 URL（`/api/sut-config`），配置后立即更新运行时的 `settings.TARGET_URL`，UI 自动化执行已使用该地址。

但性能测试模块存在以下问题：

1. **硬编码默认值**：`performance_service.py` 的 `_DEFAULT_BASE_URL = settings.TARGET_URL` 是模块级常量，在服务启动时固定，修改系统配置后不会刷新
2. **从任务 URL 提取 base URL**：`_build_client_config()` 优先从任务填写的 `target_url`（如 `https://192.168.5.44/platform/api/xxx`）中解析 base URL，覆盖了系统配置的值
3. **认证配置硬编码**：登录路径 `/platform/api/auth/login` 和验证码路径 `/platform/api/code` 是硬编码的，与被测系统的实际路径绑定

当被测系统 URL 变更（如从 `https://192.168.5.44` 改为 `https://192.168.5.45`）时：
- 现有性能测试任务的 `target_url` 仍指向旧地址
- 登录/认证的 base URL 仍使用旧地址
- 用户需要逐一修改每个任务，体验差且易出错

### 1.2 目标

1. **统一配置源**：性能测试模块的登录/认证 base URL 统一从系统配置（`settings.TARGET_URL`）读取，不依赖任务中填写的 `target_url`
2. **运行时动态读取**：执行任务时实时读取当前系统配置，而非模块导入时的快照值
3. **向后兼容**：现有任务数据无需修改，任务 `target_url` 仍保存完整 URL 用于展示，但认证/登录 base URL 独立于它
4. **认证路径可配置**：登录路径和验证码路径从系统配置中读取，而不是硬编码

---

## 二、功能范围

### 2.1 核心变更

| 变更 | 描述 | 影响范围 |
|------|------|---------|
| 移除模块级常量 | 删除 `_DEFAULT_BASE_URL`，改为运行时读取 `settings.TARGET_URL` | `performance_service.py` |
| 修正 base URL 来源 | `_build_client_config()` 不再从任务 `target_url` 中解析 base URL，直接使用 `settings.TARGET_URL` | `performance_service.py` |
| 认证路径可配置化 | 登录路径和验证码路径从配置中读取 | `performance_service.py` |
| 系统配置 API 扩展 | 增加 `login_path` 和 `captcha_path` 字段到系统配置中 | `schemas/dingtalk_config.py`、`system.py` |

### 2.2 不变的部分

- 任务的 `target_url` 字段结构不变（仍保存完整 URL）
- 任务的创建/编辑/列表/删除 API 不变
- 前端表单不变
- 性能执行引擎 `PerformanceExecutor` 不变

---

## 三、详细需求

### 3.1 运行时获取 base URL

**当前代码**（`performance_service.py` 第 35 行）：

```python
_DEFAULT_BASE_URL = settings.TARGET_URL
```

**问题**：模块级常量在导入时固定，后续 `settings.TARGET_URL` 变更不会同步。

**改为**：

```python
@staticmethod
def _get_base_url() -> str:
    """获取当前系统配置的被测系统 URL（运行时动态读取）"""
    return settings.TARGET_URL
```

### 3.2 `_build_client_config()` 不再从任务 URL 提取 base URL

**当前代码**：

```python
base_url = _DEFAULT_BASE_URL
if target_url:
    try:
        from urllib.parse import urlparse
        parsed = urlparse(target_url)
        if parsed.scheme and parsed.netloc:
            base_url = f"{parsed.scheme}://{parsed.netloc}"
    except Exception:
        pass
```

**改为**：直接使用 `_get_base_url()`，不再从 `target_url` 解析。

### 3.3 认证路径从系统配置读取

**当前代码**（硬编码）：

```python
_DEFAULT_AUTH_CONFIG = {
    "login_path": "/platform/api/auth/login",
    "captcha_path": "/platform/api/code",
}
```

**改为**：从 `settings` 中读取，或从系统配置 API 扩展的字段中读取。

### 3.4 系统配置扩展

在 `SutConfigResponse` 和 `SutConfigUpdateRequest` 中增加两个可选字段：

| 字段 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `login_path` | str | `/platform/api/auth/login` | 登录接口路径 |
| `captcha_path` | str | `/platform/api/code` | 验证码接口路径 |

---

## 四、技术方案

### 4.1 修改文件清单

| 文件 | 修改内容 |
|------|---------|
| `backend/app/services/performance_service.py` | 移除 `_DEFAULT_BASE_URL`，`_build_client_config()` 改用 `settings.TARGET_URL`，认证路径从配置读取 |
| `backend/app/schemas/dingtalk_config.py` | `SutConfigResponse` 和 `SutConfigUpdateRequest` 增加 `login_path`、`captcha_path` 字段 |
| `backend/app/routers/system.py` | `/api/sut-config` 的 GET/PUT 接口处理新增字段 |
| `backend/app/config.py` | 增加 `AUTH_LOGIN_PATH`、`AUTH_CAPTCHA_PATH` 环境变量默认值 |
| `backend/app/models/dingtalk_config.py` | 增加 `login_path`、`captcha_path` 字段 |
| `frontend/src/views/system/Settings.vue` | 增加认证路径配置项 |

### 4.2 数据流

```
用户修改系统配置
  → PUT /api/sut-config {url, login_path, captcha_path}
  → 持久化到 DingTalkConfig 表
  → 更新 settings.TARGET_URL / settings.AUTH_LOGIN_PATH / settings.AUTH_CAPTCHA_PATH
  → 执行性能测试任务时，_build_client_config() 读取 settings 中的值
  → HttpClient 使用正确的 base URL + 认证路径进行登录
```

### 4.3 兼容性

- 现有任务数据无需迁移
- 新增字段有默认值，不影响现有 API 调用
- 性能测试任务的 `target_url` 仍保存完整 URL（用于展示和压测请求），但登录/认证不再依赖它

---

## 五、风险与缓解

| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| 任务 `target_url` 指向旧系统，但认证使用新系统 | 登录 Token 与请求目标不一致 | 任务的 `target_url` 应指向新系统，由用户手动更新；认证 base URL 独立控制 |
| 系统配置尚未保存时执行任务 | 使用默认值 | `settings` 类已有默认值，不依赖数据库 |
| 认证路径变更后旧任务执行异常 | 登录失败 | 系统配置变更后，所有涉及登录的模块（UI/性能/安全）都会受影响，属于正常预期 |

---

*本文档为性能测试模块读取系统配置被测系统 URL 的需求定义，后续将输出计划执行文档用于指导开发。*