# 测试指南

本文档总结项目中的测试目标、推荐执行方式和常见检查项，便于在开发与交付阶段保持质量稳定。

## 测试范围

- 代码级功能验证。
- 接口和集成流程验证。
- 关键路径的回归检查。

## 建议流程

1. 在修改功能前确认测试目标。
2. 使用现有测试或手工验证覆盖核心场景。
3. 对影响较大的改动进行回归检查后再交付。

## 注意事项

- 优先验证最关键的业务路径。
- 对异常场景和边界条件要做针对性检查。
- 测试结果应与实际变更内容保持一致。

<cite>
**本文引用的文件**
- `karma.conf.js`
- `package.json`
- `angular.json`
- `tsconfig.spec.json`
- `src/app/comparable-company-selection/comparable-company-selection.component.spec.ts`
- `src-tauri/src/commands/entropy_weight_commands.rs`
- `src-tauri/src/commands/calculation_commands.rs`
- `src-tauri/Cargo.toml`
- `README.md`
- `docs/testing/greedy-determinism-test-guide.md`
</cite>

## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)

## 简介
本测试指南面向GSDJGXApp项目的质量保障与持续改进目标，覆盖前端（Angular + Jasmine + Karma）、后端（Rust + Tauri）以及跨端算法（熵权法、TOPSIS、指标归一化）的测试策略与实施路径。文档明确测试分层（单元、集成、端到端）、覆盖率门槛（建议行/函数/分支≥70%）、测试数据准备与清理策略，并给出持续集成中的自动化测试执行与质量门禁建议。

## 项目结构
项目采用前后端分离与跨端结合的架构：
- 前端：Angular 22应用，使用Jasmine + Karma进行单元与集成测试，构建与测试通过Angular DevKit桥接。
- 后端：Rust库（静态库/CDYLIB/RLIB）通过Tauri命令暴露给前端调用，使用SeaORM连接SQLite进行数据持久化。
- 测试：前端测试配置位于根目录的Karma配置文件；Rust侧通过标准测试运行器与命令模块进行测试；部分算法文档与测试指导位于docs/testing。

```mermaid
graph TB
subgraph "前端Angular"
A["组件与服务<br/>Jasmine + Karma"]
end
subgraph "后端Rust/Tauri"
B["命令模块<br/>calculation_commands.rs / entropy_weight_commands.rs"]
C["服务层<br/>算法与数据处理"]
D["数据库<br/>SeaORM + SQLite"]
end
A --> |"调用命令"| B
B --> C
B --> D
```

**图表来源**
- `angular.json#L62-L74`
- `karma.conf.js#L1-L62`
- `src-tauri/src/commands/entropy_weight_commands.rs#L1-L78`
- `src-tauri/src/commands/calculation_commands.rs#L1-L315`
- `src-tauri/Cargo.toml#L26-L66`

**章节来源**
- `angular.json#L1-L79`
- `karma.conf.js#L1-L62`
- `package.json#L1-L90`
- `tsconfig.spec.json#L1-L15`
- `src-tauri/Cargo.toml#L1-L66`

## 核心组件
- 前端测试框架与脚本
  - Jasmine + Karma：通过Angular DevKit桥接，支持覆盖率输出与HTML报告。
  - 测试脚本：提供test、test:watch、test:coverage等命令。
- 后端测试框架与依赖
  - Rust标准测试运行器：命令模块与服务层均可独立测试。
  - 依赖：SeaORM（SQLite）、log、anyhow等，便于测试时注入Mock或替换实现。
- 关键算法模块
  - 熵权法与加权得分：通过命令暴露，支持组合分析。
  - 指标归一化：统一标准化入口，支持线性/对数、正向/负向处理。

**章节来源**
- `package.json#L4-L16`
- `karma.conf.js#L4-L61`
- `src-tauri/src/commands/entropy_weight_commands.rs#L1-L78`
- `src-tauri/src/commands/calculation_commands.rs#L50-L315`
- `src-tauri/Cargo.toml#L26-L66`

## 架构总览
下图展示从前端组件到后端命令与服务的调用链路，以及测试关注点：

```mermaid
sequenceDiagram
participant FE as "前端组件/服务"
participant TAURI as "Tauri命令"
participant SVC as "服务层算法/数据"
participant DB as "数据库SeaORM"
FE->>TAURI : "调用标准化/熵权/TOPSIS等命令"
TAURI->>SVC : "解析请求参数并调用算法"
SVC->>DB : "读取/写入必要数据可选"
DB-->>SVC : "返回数据"
SVC-->>TAURI : "返回计算结果"
TAURI-->>FE : "返回响应含错误处理"
```

**图表来源**
- `src-tauri/src/commands/entropy_weight_commands.rs#L19-L77`
- `src-tauri/src/commands/calculation_commands.rs#L58-L315`
- `src-tauri/Cargo.toml#L38-L41`

## 详细组件分析

### 前端组件测试（Angular）
- 测试框架与配置
  - Jasmine + Karma：通过Angular DevKit构建器执行，支持覆盖率与HTML报告。
  - 配置要点：浏览器启动器、覆盖率输出、Jasmine超时与随机执行控制。
- 示例组件测试
  - 可比公司选择组件的基础创建校验，确保组件初始化正确。
- 用户交互测试
  - 建议使用Angular Testing Library或DevKit测试工具，模拟用户点击、输入、路由导航等行为。
- 覆盖率与质量门槛
  - 建议行/函数/分支覆盖率≥70%，可通过Karma覆盖率插件生成报告并集成CI。

```mermaid
flowchart TD
Start(["开始：执行ng test"]) --> LoadCfg["加载Karma配置<br/>Jasmine + Coverage"]
LoadCfg --> RunSpecs["执行*.spec.ts用例"]
RunSpecs --> Report["生成覆盖率报告<br/>HTML + 文本摘要"]
Report --> Gate{"覆盖率达标？"}
Gate --> |是| Pass["通过"]
Gate --> |否| Fail["不通过需补充用例"]
```

**图表来源**
- `karma.conf.js#L29-L36`
- `angular.json#L62-L74`
- `package.json#L9-L11`

**章节来源**
- `karma.conf.js#L1-L62`
- `angular.json#L62-L74`
- `tsconfig.spec.json#L1-L15`
- `src/app/comparable-company-selection/comparable-company-selection.component.spec.ts#L1-L24`

### 后端功能测试（Rust/Tauri）
- 命令模块测试
  - 熵权法相关命令：权重计算、原始距离矩阵、加权得分、组合分析。
  - 归一化命令：matrix_normalize，支持线性/对数、正向/负向指标处理。
- 服务层测试
  - 将算法逻辑抽象为独立服务函数，便于单元测试与Mock。
- 数据库测试
  - 使用SeaORM连接SQLite，建议在测试前准备内存数据库或临时文件数据库，测试后清理。
- 覆盖率与质量门槛
  - 建议行/函数/分支覆盖率≥70%，可通过cargo llvm-cov或tarpaulin生成报告。

```mermaid
flowchart TD
A["Rust命令入口"] --> B["服务层算法实现"]
B --> C{"需要访问数据库？"}
C --> |是| D["SeaORM连接SQLite"]
C --> |否| E["纯内存计算"]
D --> F["返回结果/错误"]
E --> F
```

**图表来源**
- `src-tauri/src/commands/entropy_weight_commands.rs#L19-L77`
- `src-tauri/src/commands/calculation_commands.rs#L58-L315`
- `src-tauri/Cargo.toml#L38-L41`

**章节来源**
- `src-tauri/src/commands/entropy_weight_commands.rs#L1-L78`
- `src-tauri/src/commands/calculation_commands.rs#L1-L315`
- `src-tauri/Cargo.toml#L1-L66`

### 核心算法测试（熵权法、TOPSIS、指标归一化）

#### 熵权法与加权得分
- 功能要点
  - 权重计算：基于熵值法计算指标权重。
  - 原始距离矩阵：不进行标准化，交由前端控制标准化与负向指标处理。
  - 加权得分：基于标准化数据与权重计算，不包含排序。
  - 组合命令：一次性完成熵权与加权矩阵计算。
- 边界与准确性验证
  - 输入为空、指标为空、权重为零、NaN/无穷大值处理。
  - 与数学定义一致性校验（熵值法权重和为1、权重非负）。
- 性能测试
  - 大规模公司/指标矩阵下的耗时与内存占用评估。

```mermaid
sequenceDiagram
participant FE as "前端"
participant CMD as "熵权命令"
participant SVC as "熵权服务"
FE->>CMD : "EntropyWeightRequest"
CMD->>SVC : "calculate_entropy_weights"
SVC-->>CMD : "权重结果"
CMD-->>FE : "返回权重"
FE->>CMD : "计算加权得分标准化数据+权重"
CMD-->>FE : "返回加权矩阵"
```

**图表来源**
- `src-tauri/src/commands/entropy_weight_commands.rs#L19-L77`

**章节来源**
- `src-tauri/src/commands/entropy_weight_commands.rs#L1-L78`

#### 指标归一化
- 功能要点
  - 统一入口：matrix_normalize。
  - 方法：线性标准化、对数标准化（仅正数）。
  - 方向：正向指标（越大越好）、负向指标（越小越好）。
  - 边界：缺失值填充、范围为0时的特殊处理、数值边界调整（避免除零）。
- 边界与准确性验证
  - 缺失指标填充、空数组、全零范围、对数变换的非正值过滤。
  - 输出标准化值在[0,1]范围内且方向处理正确。
- 性能测试
  - 大批量公司/指标的归一化耗时与内存占用。

```mermaid
flowchart TD
Start(["开始：matrix_normalize"]) --> CheckEmpty{"输入为空？"}
CheckEmpty --> |是| Err["返回错误"]
CheckEmpty --> |否| Fill["缺失值填充为0"]
Fill --> Methods{"标准化方法？"}
Methods --> |线性| Linear["线性标准化"]
Methods --> |对数| Log["对数标准化仅正数"]
Linear --> Direction{"指标方向？"}
Log --> Direction
Direction --> |正向| Pos["保持不变"]
Direction --> |负向| Neg["1 - 标准化值"]
Pos --> Clamp["Clamp到[0,1]"]
Neg --> Clamp
Clamp --> Done(["返回标准化结果"])
```

**图表来源**
- `src-tauri/src/commands/calculation_commands.rs#L58-L315`

**章节来源**
- `src-tauri/src/commands/calculation_commands.rs#L1-L315`

#### TOPSIS（建议）
- 功能要点
  - 标准化后计算正理想解与负理想解的距离，得到相对接近度排序。
- 测试建议
  - 边界：零向量、维度不一致、权重为空。
  - 准确性：与参考实现或手工计算对照。
  - 性能：大规模样本下的排序效率。

（本节为概念性说明，不直接分析具体源码文件）

### 端到端测试（E2E）
- 目标
  - 覆盖真实用户场景，验证从前端交互到后端命令与数据库的完整流程。
- 工具与策略
  - 建议使用Cypress或Playwright进行E2E测试，结合Karma/Jasmine的单元测试形成完整测试金字塔。
- 关注点
  - 用户登录/权限、数据导入导出、算法计算全流程、错误提示与恢复。

（本节为概念性说明，不直接分析具体源码文件）

## 依赖关系分析
- 前端依赖
  - Angular CLI、Jasmine、Karma、Coverage Reporter等。
- 后端依赖
  - SeaORM（SQLite）、log、anyhow、chrono等，便于测试时替换或Mock。
- 测试耦合与内聚
  - 命令模块作为后端与前端的契约层，应尽量保持稳定；服务层算法可独立测试。

```mermaid
graph LR
Pkg["package.json 脚本与依赖"] --> Karma["Karma 配置"]
Pkg --> Angular["Angular 构建/测试配置"]
Angular --> Specs["*.spec.ts 测试文件"]
Cargo["Cargo.toml 依赖"] --> RustLib["Rust 库静态/CDYLIB/RLIB"]
RustLib --> Commands["命令模块"]
Commands --> Services["服务层"]
Commands --> DB["数据库SeaORM"]
```

**图表来源**
- `package.json#L1-L90`
- `angular.json#L62-L74`
- `karma.conf.js#L1-L62`
- `src-tauri/Cargo.toml#L26-L66`

**章节来源**
- `package.json#L1-L90`
- `angular.json#L1-L79`
- `karma.conf.js#L1-L62`
- `src-tauri/Cargo.toml#L1-L66`

## 性能考虑
- 前端
  - 使用Chrome Headless无沙箱模式提升CI稳定性；合理设置超时与断连容忍度。
- 后端
  - 对大规模矩阵运算（熵权法、TOPSIS）进行基准测试，识别瓶颈；必要时引入并行或近似算法。
- 覆盖率
  - 建议行/函数/分支≥70%，并通过CI强制阈值，防止回归。

（本节为通用指导，不直接分析具体源码文件）

## 故障排查指南
- 前端测试常见问题
  - 浏览器启动失败：检查自定义启动器标志与CI环境权限。
  - 覆盖率报告缺失：确认覆盖率插件配置与输出目录。
- 后端测试常见问题
  - 数据库连接失败：确保测试前初始化内存/临时数据库，测试后清理。
  - 命令返回错误：检查请求参数、空输入、边界条件处理。
- 算法异常
  - 熵权法权重异常：检查输入数据是否包含NaN/无穷大、指标为空等情况。
  - 归一化异常：检查对数变换的非正值过滤与范围为0的处理。

**章节来源**
- `karma.conf.js#L39-L54`
- `src-tauri/src/commands/entropy_weight_commands.rs#L24-L27`
- `src-tauri/src/commands/calculation_commands.rs#L67-L77`

## 结论
本指南提供了GSDJGXApp的测试策略与实施路径：前端以Jasmine + Karma为核心，后端以Rust命令与服务层为核心，围绕熵权法、TOPSIS与指标归一化等关键算法建立边界、准确性与性能测试，并建议在CI中强制覆盖率门槛与质量门禁，确保系统稳定性与可维护性。

## 附录

### 测试框架配置与脚本
- 前端
  - 测试脚本：test、test:watch、test:coverage。
  - 配置：Jasmine选项、覆盖率输出、浏览器启动器、超时与断连设置。
- 后端
  - 依赖：SeaORM、log、anyhow、chrono等。
  - 建议：为命令模块与服务层编写独立测试，必要时使用内存数据库或临时文件数据库。

**章节来源**
- `package.json#L4-L16`
- `karma.conf.js#L1-L62`
- `src-tauri/Cargo.toml#L26-L66`

### 测试数据准备与清理
- 前端
  - 使用Jasmine的beforeEach/beforeAll准备Mock数据与组件实例；使用afterEach清理状态。
- 后端
  - 初始化内存数据库或临时文件数据库；测试结束后删除临时文件或清空表。
- 算法
  - 准备边界数据集：空输入、全零、极大/极小值、NaN/无穷大、负对数值等。

（本节为通用指导，不直接分析具体源码文件）

### 持续集成测试流程
- 自动化执行
  - 在CI中执行ng test与cargo test，分别生成前端与后端覆盖率报告。
- 报告生成
  - 前端：Karma HTML与文本摘要报告；后端：llvm-cov或tarpaulin报告。
- 质量门禁
  - 设置覆盖率阈值（建议≥70%），不达标则阻断合并。

（本节为通用指导，不直接分析具体源码文件）

### 相关文档与指引
- 贪婪算法确定性测试指南：用于参考确定性算法的测试方法与策略。

**章节来源**
- `docs/testing/greedy-determinism-test-guide.md`