|
|
# CNC机床数据采集系统 - 测试要求规范
|
|
|
|
|
|
## 📋 测试覆盖要求
|
|
|
|
|
|
### 核心原则
|
|
|
1. **100% 方法覆盖**:每个 public/private 方法必须有对应测试
|
|
|
2. **100% 分支覆盖**:每个方法的每个 if/else、switch/case 必须有测试
|
|
|
3. **100% 参数覆盖**:每个方法的参数组合必须测试
|
|
|
4. **边界测试**:null、空字符串、最大值、最小值、异常值
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🔧 测试编写标准
|
|
|
|
|
|
### 每个测试文件必须包含
|
|
|
- **构造函数测试**:每个依赖参数的 null 测试
|
|
|
- **正常场景测试**:成功路径的完整测试
|
|
|
- **异常场景测试**:所有可能的异常情况
|
|
|
- **分支覆盖测试**:每个 if/else 的独立测试
|
|
|
- **边界值测试**:null、空、极值
|
|
|
|
|
|
### 测试方法命名规范
|
|
|
```
|
|
|
[正常场景]
|
|
|
MethodName_WhenValidInput_ReturnsExpectedResult
|
|
|
|
|
|
[异常场景]
|
|
|
MethodName_WhenNullInput_ThrowsArgumentNullException
|
|
|
|
|
|
[边界测试]
|
|
|
MethodName_WhenEmptyString_ReturnsDefaultValue
|
|
|
MethodName_WhenMaximumValue_ReturnsExpectedValue
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🎯 执行流程(必须严格遵守)
|
|
|
|
|
|
### 阶段 1:代码修改前
|
|
|
```powershell
|
|
|
# 运行现有测试
|
|
|
dotnet test Haoliang.Tests/Haoliang.Tests.csproj
|
|
|
|
|
|
# 检查结果
|
|
|
# - 所有测试通过 ✅
|
|
|
# - 无编译错误 ✅
|
|
|
```
|
|
|
|
|
|
### 阶段 2:代码修改
|
|
|
- 修改任何代码文件
|
|
|
- **禁止提交**:测试不通过的情况下
|
|
|
|
|
|
### 阶段 3:代码修改后(必须执行)
|
|
|
```powershell
|
|
|
# 编译项目
|
|
|
dotnet build Haoliang.sln -c Release
|
|
|
|
|
|
# 运行完整测试套件
|
|
|
dotnet test Haoliang.Tests/Haoliang.Tests.csproj --verbosity normal
|
|
|
|
|
|
# 生成覆盖率报告
|
|
|
dotnet test --collect:"XPlat Code Coverage" --results-directory ./TestResults
|
|
|
```
|
|
|
|
|
|
### 阶段 4:验证标准
|
|
|
- ✅ 所有测试通过
|
|
|
- ✅ 编译成功,0错误
|
|
|
- ✅ 覆盖率达到要求
|
|
|
- ✅ 无测试失败
|
|
|
|
|
|
### 阶段 5:继续下一步
|
|
|
- **测试通过**:提交代码,推送到远程仓库,继续后续任务
|
|
|
- **测试失败**:修复测试或代码,重新执行阶段 3
|
|
|
|
|
|
### ⚠️ 重要要求:每次代码修改后必须执行 push
|
|
|
- **强制要求**:每次修改代码并测试通过后,必须执行 `git push` 推送到远程仓库
|
|
|
- **执行流程**:
|
|
|
1. 修改代码
|
|
|
2. 运行 `dotnet test` 确保测试通过
|
|
|
3. 运行 `git add` 添加修改的文件
|
|
|
4. 运行 `git commit` 提交更改
|
|
|
5. **必须**运行 `git push` 推送到远程仓库
|
|
|
6. 如果遇到冲突,先解决冲突后再 push
|
|
|
- **禁止行为**:
|
|
|
- ❌ 修改代码后只本地提交,不推送到远程
|
|
|
- ❌ 跳过测试步骤直接 push
|
|
|
- ❌ 测试失败的情况下 push 代码
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🚫 禁止的行为
|
|
|
|
|
|
### ❌ 绝对禁止
|
|
|
- 在测试不通过的情况下提交代码
|
|
|
- 跳过任何方法的测试
|
|
|
- 忽略 if/else 分支的测试
|
|
|
- 不测试异常场景
|
|
|
- 代码修改后不运行测试就继续
|
|
|
|
|
|
---
|
|
|
|
|
|
## 📊 测试文件结构要求
|
|
|
|
|
|
```
|
|
|
Haoliang.Tests/
|
|
|
├── Controllers/
|
|
|
│ ├── SystemControllerTests.cs
|
|
|
│ ├── DeviceControllerTests.cs
|
|
|
│ └── [所有控制器必须有测试]
|
|
|
├── Services/
|
|
|
│ ├── SchedulerServiceTests.cs
|
|
|
│ ├── DeviceCollectionServiceTests.cs
|
|
|
│ └── [所有服务必须有测试]
|
|
|
├── Repositories/
|
|
|
│ └── [所有仓储必须有测试]
|
|
|
└── Middleware/
|
|
|
└── [所有中间件必须有测试]
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🔍 验证命令
|
|
|
|
|
|
### 运行所有测试
|
|
|
```powershell
|
|
|
cd D:\opencode\haoliang
|
|
|
dotnet test Haoliang.Tests/Haoliang.Tests.csproj --verbosity normal
|
|
|
```
|
|
|
|
|
|
### 生成覆盖率报告
|
|
|
```powershell
|
|
|
cd D:\opencode\haoliang
|
|
|
dotnet test --collect:"XPlat Code Coverage" --results-directory ./TestResults
|
|
|
```
|
|
|
|
|
|
### 查看测试结果
|
|
|
```powershell
|
|
|
# 测试通过
|
|
|
Total: XX, Passed: XX, Failed: 0, Skipped: 0
|
|
|
|
|
|
# 覆盖率报告
|
|
|
Line coverage: 100%
|
|
|
Branch coverage: 100%
|
|
|
Method coverage: 100%
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## ✅ 每次代码修改的检查清单
|
|
|
|
|
|
修改代码前:
|
|
|
- [ ] 运行 `dotnet test`,确保现有测试全部通过
|
|
|
- [ ] 确认没有编译警告或错误
|
|
|
|
|
|
修改代码后:
|
|
|
- [ ] 运行 `dotnet build`,确保编译成功
|
|
|
- [ ] 运行 `dotnettest`,确保所有测试通过
|
|
|
- [ ] 检查测试覆盖率,确保达到要求
|
|
|
- [ ] **测试不通过禁止提交代码**
|
|
|
|
|
|
提交代码前:
|
|
|
- [ ] 确认所有测试通过
|
|
|
- [ ] 确认编译无错误
|
|
|
- [ ] 确认覆盖率达标
|
|
|
|
|
|
---
|
|
|
|
|
|
## 📝 优先级测试
|
|
|
|
|
|
### 高优先级(必须立即完成)
|
|
|
1. SystemControllerControllerTests.cs - 问题 1 的验证测试
|
|
|
2. SchedulerServiceTests.cs - 问题 1 的服务测试
|
|
|
|
|
|
### 中优先级
|
|
|
3. DeviceControllerTests.cs
|
|
|
4. DeviceCollectionServiceTests.cs
|
|
|
5. 其他控制器和服务测试
|
|
|
|
|
|
### 低优先级
|
|
|
6. Repositories 测试
|
|
|
7. Middleware 测试
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🎯 执行顺序
|
|
|
|
|
|
1. 创建高优先级测试文件
|
|
|
2. 运行测试套件
|
|
|
3. 验证 100% 覆盖率
|
|
|
4. 修复任何失败的测试
|
|
|
5. 重复直到所有测试通过
|
|
|
|
|
|
---
|
|
|
|
|
|
**版本**: 1.0
|
|
|
**最后更新**: 2026-04-15
|
|
|
**状态**: 已生效,所有代码修改必须遵守
|