Files
BIPMaterialManager/docs/testing/TEST_COVERAGE_IMPROVEMENT_PLAN.md
Misaka_Company 681f3ba517 refactor(docs): reorganize documentation directory structure
- Create user/ - User guides and configuration documentation
- Create features/ - Feature specifications and business flows
- Create debugging/ - Debug guides and quick references
- Create testing/ - Test infrastructure, reports, and plans
- Create internal/ - Internal plans, analyses, and templates
- Move cleaner/*.md to cleaner/ directory
- Move LOGGING_*.md to developer/guides/

Add docs/README.md as documentation index with category navigation
and quick lookup guide.

The reorganized structure makes it easier for users and developers
to quickly locate relevant documentation.
2026-04-14 12:15:09 +08:00

29 KiB
Raw Blame History

ERPAuto 测试覆盖率提升计划

1. 执行摘要

1.1 当前状态评估

指标 当前值 目标值 差距
总体行覆盖率 11.36% 70% -58.64%
总体函数覆盖率 21.29% 70% -48.71%
总体分支覆盖率 10.08% 60% -49.92%
测试文件总数 54 100+ -46+

关键模块覆盖率差距:

模块 当前覆盖率 要求阈值 优先级
ERP 服务 (src/main/services/erp/**) 11.68% 80% P0
更新服务 (src/main/services/update/**) 42.45% 80% P0
数据库服务 17.24% 70% P1
配置管理 20.56% 70% P1
日志服务 70.67% 70% P2 (已达标的)

1.2 提升目标

阶段性目标:

  • Phase 1 (4 周)ERP 服务达到 60%,更新服务达到 70%
  • Phase 2 (4 周):数据库服务达到 60%,配置管理达到 60%
  • Phase 3 (4 周):所有关键模块达到目标阈值,总体覆盖率达到 70%

最终目标:

  • 全局覆盖率70% 行 / 70% 函数 / 60% 分支
  • ERP 服务80% 行 / 80% 函数 / 70% 分支
  • 更新服务80% 行 / 80% 函数 / 70% 分支

1.3 时间线估算

阶段 持续时间 里程碑
Phase 1 4 周 ERP 核心服务测试完成
Phase 2 4 周 数据层与配置层测试完成
Phase 3 4 周 集成测试与 E2E 补全
缓冲期 2 周 修复与优化
总计 14 周 达到目标覆盖率

2. 分阶段提升计划

Phase 1: ERP 核心服务测试攻坚(第 1-4 周)

目标: ERP 服务覆盖率从 11.68% 提升至 60%

工作内容:

模块 文件数 新增测试数 优先级
erp-auth.ts 1 15 P0
extractor.ts 1 20 P0
extractor-core.ts 1 15 P0
cleaner.ts 1 12 P0
ErpBrowserManager.ts 1 10 P1
order-resolver.ts 1 8 P1
page-diagnostics.ts 1 6 P2
erp-error-context.ts 1 5 P2
locators.ts 1 8 P1

预计投入: 80-100 小时

成功标准:

  • ERP 服务行覆盖率 ≥ 60%
  • ERP 服务函数覆盖率 ≥ 70%
  • 新增测试文件9 个
  • 所有 P0 模块有完整测试覆盖

Phase 2: 数据层与配置层测试(第 5-8 周)

目标: 数据库服务与配置管理覆盖率达标

工作内容:

2.1 数据库服务17.24% → 60%

模块 文件数 新增测试数 优先级
mysql.ts / sql-server.ts / postgresql.ts 3 18 P0
data-source.ts 1 8 P0
data-importer.ts 1 10 P0
DAO 层文件 4 16 P1
Repository 层 2 8 P1
数据库实体 2 6 P2

2.2 配置管理20.56% → 60%

模块 文件数 新增测试数 优先级
config-manager.ts 1 20 P0
配置 Schema 验证 1 10 P1

2.3 用户服务(新增)

模块 文件数 新增测试数 优先级
session-manager.ts 1 8 P1
user-erp-config-service.ts 1 10 P1
bip-users-dao.ts 1 6 P2

预计投入: 100-120 小时

成功标准:

  • 数据库服务行覆盖率 ≥ 60%
  • 配置管理行覆盖率 ≥ 60%
  • 新增测试文件15 个
  • 所有数据库方言有完整测试

Phase 3: 更新服务与其他模块补全(第 9-12 周)

目标: 更新服务达到 80%,其他服务达到 70%

工作内容:

3.1 更新服务42.45% → 80%

模块 文件数 新增测试数 优先级
update-service.ts 1 15 P0
update-catalog-service.ts 1 12 P0
update-installer.ts 1 10 P0
update-storage-client.ts 1 10 P0
update-status-publisher.ts 1 6 P1
update-support.ts 1 5 P1
update-utils.ts 1 5 P2

3.2 其他关键服务

模块 文件数 新增测试数 优先级
验证服务 (validation/**) 3 15 P1
清理服务 (cleaner/**) 2 10 P1
Excel 服务 2 8 P2
报告生成 1 6 P2
Playwright 浏览器服务 2 10 P1
RustFS 服务 2 8 P2

预计投入: 100-120 小时

成功标准:

  • 更新服务行覆盖率 ≥ 80%
  • 更新服务函数覆盖率 ≥ 80%
  • 新增测试文件17 个
  • 所有 P0/P1 模块覆盖率达标

Phase 4: 集成测试与 E2E 强化(第 13-14 周)

目标: 强化集成测试与端到端测试

工作内容:

4.1 集成测试扩展7 → 20 个)

测试场景 优先级 描述
ERP 登录 + 提取完整流程 P0 验证认证与数据提取集成
数据库事务完整流程 P0 验证 TypeORM 事务边界
配置热加载与验证 P1 验证配置更新传播
更新检查 + 下载 + 安装流程 P0 验证更新完整链路
日志异步写入与轮转 P1 验证日志系统
用户会话切换流程 P1 验证多用户场景
Excel 导入导出完整流程 P2 验证文件处理链

4.2 E2E 测试扩展3 → 15 个)

用户旅程 优先级 描述
管理员完整工作流程 P0 登录 → 提取 → 清理 → 验证 → 登出
普通用户数据提取流程 P0 登录 → 提取 → 查看结果
Guest 只读访问流程 P1 登录 → 查看历史记录
配置管理流程 P1 修改配置 → 保存 → 验证生效
自动更新流程 P0 检查更新 → 下载 → 安装 → 重启
错误恢复流程 P1 断网重连、会话过期恢复
批量处理流程 P1 大批量订单处理性能验证

预计投入: 60-80 小时

成功标准:

  • 集成测试文件20 个
  • E2E 测试文件15 个
  • 关键用户旅程 100% 覆盖
  • 整体覆盖率达到 70%

3. 逐模块测试计划

3.1 ERP 服务模块

3.1.1 erp-auth.ts (P0)

当前覆盖率: < 20%
目标覆盖率: 80%

测试场景 测试类型 Mock 对象 预期结果
成功登录流程 单元 Playwright Browser/Context/Page 返回有效 ErpSession
登录失败 - 网络错误 单元 Playwright + 模拟网络错误 抛出连接错误
登录失败 - 凭证错误 单元 Page + 模拟错误消息 抛出认证错误
会话复用 - 已登录 单元 Session Mock 直接返回现有会话
登出流程 单元 Browser/Context Mock 资源正确释放
会话超时检测 单元 Page + 超时 Mock 返回未登录状态
页面元素定位失败 单元 Page + Selector 失败 抛出元素未找到错误
SSL 证书错误处理 集成 真实 Browser + 自签名证书 成功建立连接

预计测试数: 15


3.1.2 extractor.ts (P0)

当前覆盖率: ~30%
目标覆盖率: 80%

测试场景 测试类型 Mock 对象 预期结果
单订单提取成功 单元 ErpAuthService + Page 返回 ExtractorResult
批量订单提取 单元 ErpAuthService + 循环 Mock 正确分批处理
订单号无效处理 单元 Page + 错误响应 记录错误,继续处理
下载文件合并 单元 ExcelJS + fs Mock 生成合并文件
数据库持久化 集成 DatabaseService Mock 记录成功导入
并发限制控制 单元 信号量 Mock 不超过并发上限
提取中断恢复 集成 模拟中断 + 恢复 从断点继续
结果统计准确性 单元 完整 Mock 链 统计数字准确

预计测试数: 20


3.1.3 extractor-core.ts (P0)

当前覆盖率: < 10%
目标覆盖率: 80%

测试场景 测试类型 Mock 对象 预期结果
页面导航到列表页 单元 Page + Frame 成功导航
订单号输入 单元 Locator Mock 正确填充
查询按钮点击 单元 Locator Mock 触发查询
表格数据解析 单元 Table Locator 返回物料列表
分页处理 单元 Page + 多页 Mock 遍历所有页
下载按钮点击 单元 Locator + Dialog 触发下载
下载完成等待 单元 fs + 文件事件 文件落地
错误弹窗检测 单元 Page + 错误元素 捕获错误消息

预计测试数: 15


3.1.4 cleaner.ts (P0)

当前覆盖率: ~25%
目标覆盖率: 80%

测试场景 测试类型 Mock 对象 预期结果
单物料删除成功 单元 Page + Locator 删除成功
批量物料删除 单元 循环删除 Mock 全部删除
物料不存在处理 单元 Page + 空结果 跳过并记录
删除按钮失效处理 单元 Locator + disabled 跳过该物料
干运行模式 单元 不执行实际删除 返回预览结果
并发控制 单元 信号量 Mock 限制并发数
错误重试机制 集成 失败→成功 Mock 重试成功
删除结果统计 单元 完整 Mock 链 统计准确

预计测试数: 12


3.2 数据库服务模块

3.2.1 数据库连接服务 (P0)

文件: mysql.ts, sql-server.ts, postgresql.ts

当前覆盖率: ~20%
目标覆盖率: 70%

测试场景 测试类型 Mock 对象 预期结果
MySQL 连接成功 单元 mysql2 Pool Mock 返回连接实例
SQL Server 连接成功 单元 mssql Connection Mock 返回连接实例
PostgreSQL 连接成功 单元 pg Pool Mock 返回连接实例
连接失败处理 单元 模拟连接拒绝 抛出错误
查询执行成功 集成 数据库 Mock + 返回结果 正确返回数据
事务提交 集成 Transaction Mock 成功提交
事务回滚 集成 Transaction Mock + 错误 正确回滚
连接池释放 单元 Pool Mock 正确关闭

预计测试数: 18 (3 个数据库 × 6 场景)


3.2.2 数据源管理 (P0)

文件: data-source.ts

当前覆盖率: < 10%
目标覆盖率: 70%

测试场景 测试类型 Mock 对象 预期结果
TypeORM 初始化 单元 DataSource Mock 成功初始化
数据源销毁 单元 DataSource Mock 正确释放
Repository 获取 单元 Repository Mock 返回对应仓库
实体注册验证 单元 Entity Mock 所有实体已注册
多次初始化防护 单元 状态检查 Mock 不重复初始化

预计测试数: 8


3.2.3 数据导入器 (P0)

文件: data-importer.ts

当前覆盖率: < 15%
目标覆盖率: 70%

测试场景 测试类型 Mock 对象 预期结果
Excel 读取成功 集成 ExcelJS + 测试文件 解析数据结构
数据验证通过 单元 Schema 验证 Mock 数据合法
数据验证失败 单元 Schema 验证 Mock 抛出验证错误
批量插入 集成 Repository Mock 正确分批插入
重复数据处理 单元 Repository + exists 检查 跳过或更新
插入失败回滚 集成 Transaction Mock + 错误 全部回滚
导入进度追踪 单元 EventEmitter Mock 发送进度事件
导入结果统计 单元 完整 Mock 链 统计准确

预计测试数: 10


3.3 配置管理模块

3.3.1 config-manager.ts (P0)

当前覆盖率: ~25%
目标覆盖率: 70%

测试场景 测试类型 Mock 对象 预期结果
配置文件加载成功 单元 fs + yaml Mock 返回有效配置
配置文件不存在 单元 fs Mock + 不存在 使用默认配置
配置文件格式错误 单元 yaml Mock + 解析失败 抛出解析错误
Zod 验证失败 单元 无效配置数据 抛出验证错误
配置更新 单元 fs + yaml Mock 文件正确写入
重置为默认值 单元 完整 Mock 链 恢复默认
导出为 YAML 单元 yaml.stringify Mock 格式正确
数据库类型切换 单元 状态 Mock 返回正确配置
日志配置应用 集成 Winston Mock 日志级别生效
审计配置应用 集成 AuditLogger Mock 审计配置生效
单例模式验证 单元 多次 getInstance 返回同一实例
并发读取安全 集成 并发 Mock + 竞争 数据一致

预计测试数: 20


3.4 更新服务模块

3.4.1 update-service.ts (P0)

当前覆盖率: ~50%
目标覆盖率: 80%

测试场景 测试类型 Mock 对象 预期结果
服务初始化 单元 ConfigManager + 依赖 Mock 服务就绪
获取更新状态 单元 状态 Mock 返回当前状态
获取更新目录 单元 CatalogService Mock 返回目录结构
检查更新 - 有新版本 集成 S3Client Mock + 新版本 返回更新列表
检查更新 - 无新版本 集成 S3Client Mock + 最新版 返回空列表
下载更新 - 成功 集成 S3Client + fs Mock 文件下载成功
下载更新 - 失败 集成 S3Client + 网络错误 抛出错误
校验 SHA256 - 通过 单元 crypto Mock 校验通过
校验 SHA256 - 失败 单元 crypto Mock + 不匹配 抛出校验错误
安装更新 集成 child_process Mock 启动安装器
用户权限检查 单元 UserType Mock 正确过滤
定期自动检查 集成 setInterval Mock 按时检查

预计测试数: 15


3.4.2 update-catalog-service.ts (P0)

当前覆盖率: ~40%
目标覆盖率: 80%

测试场景 测试类型 Mock 对象 预期结果
构建更新目录 单元 StorageClient Mock 返回分类目录
稳定版过滤 单元 UserType + 目录 只看 stable
管理员全访问 单元 AdminType + 目录 看全部通道
更新历史记录 单元 Repository Mock 返回历史记录
限制记录数量 单元 数据截断 不超过上限

预计测试数: 12


3.4.3 update-storage-client.ts (P0)

当前覆盖率: ~35%
目标覆盖率: 80%

测试场景 测试类型 Mock 对象 预期结果
S3 客户端初始化 单元 AWS SDK Mock 客户端创建成功
列出更新包 单元 S3 listObjects Mock 返回对象列表
下载文件 单元 S3 getObject Mock 返回文件流
下载失败处理 单元 S3 + 网络错误 抛出错误
计算 SHA256 单元 crypto Mock 哈希值正确
重试机制 集成 失败→成功 Mock 重试成功

预计测试数: 10


4. 测试类别实施指南

4.1 单元测试

适用范围:

  • 服务类Service的业务逻辑
  • 工具函数Utility Functions
  • 数据处理函数
  • 类型转换函数

Mock 策略:

// 使用现有 Mock 库
import {
  createMockLogger,
  createMockConfigManager,
  createMockErpAuthService,
  createMockDatabaseService,
  createMockDataSource,
  createMockRepository
} from '@/tests/mocks'

// 示例ERP Auth 测试
describe('ErpAuthService', () => {
  const mockConfig = { url: 'https://test.com', username: 'test', password: 'test' }
  const mockPage = createMockPage() // 来自 mocks/index.ts

  it('should login successfully', async () => {
    mockPage.goto.mockResolvedValue(undefined)
    mockPage.waitForSelector.mockResolvedValue(undefined)

    const authService = new ErpAuthService(mockConfig)
    // 注入 mock (需要构造函数支持或使用 vi.mock)
    const session = await authService.login()

    expect(session.isLoggedIn).toBe(true)
  })
})

测试覆盖重点:

  1. 正常路径: 主要业务流程成功执行
  2. 异常路径: 错误处理、回滚、重试
  3. 边界条件: 空输入、极大值、极小值
  4. 分支覆盖: if/else、switch/case 所有分支

4.2 集成测试

适用范围:

  • 多服务协作场景
  • 数据库事务边界
  • 文件系统交互
  • 外部服务调用(需 Stub

测试模式:

import { describe, it, expect, beforeEach, afterEach } from 'vitest'
import { DatabaseService } from '@/main/services/database'
import { ConfigManager } from '@/main/services/config'

describe('Database + Config Integration', () => {
  let db: DatabaseService
  let configManager: ConfigManager

  beforeEach(async () => {
    // 使用内存数据库或测试配置
    configManager = ConfigManager.getInstance()
    db = new DatabaseService(configManager)
    await db.connect()
  })

  afterEach(async () => {
    await db.disconnect()
  })

  it('should persist and retrieve data', async () => {
    // 实际数据库操作
    await db.query('INSERT INTO ...')
    const result = await db.query('SELECT ...')

    expect(result.rows).toHaveLength(1)
  })
})

集成测试清单:

集成场景 涉及模块 预期时间
ERP 登录 + 提取 ErpAuth + Extractor < 5s
数据库事务 DataSource + Repository < 2s
配置更新传播 ConfigManager + Logger < 1s
文件导入导出 ExcelParser + fs < 3s
更新下载校验 UpdateService + S3 + crypto < 10s

4.3 E2E 测试

适用范围:

  • 完整用户旅程
  • UI 交互验证
  • 真实浏览器行为
  • 跨进程通信

Playwright 测试模式:

import { test, expect } from '@playwright/test'

test('complete extraction workflow', async ({ page }) => {
  // 1. 导航到登录页
  await page.goto('http://localhost:5173/login')

  // 2. 登录
  await page.getByPlaceholder('用户名').fill('admin')
  await page.getByPlaceholder('密码').fill('admin123')
  await page.getByRole('button', { name: '登录' }).click()

  // 3. 等待跳转
  await expect(page).toHaveURL(/dashboard/)

  // 4. 进入提取页面
  await page.getByText('数据提取').click()

  // 5. 输入订单号
  await page.getByPlaceholder('请输入订单号').fill('SC202601001')

  // 6. 开始提取
  await page.getByRole('button', { name: '开始提取' }).click()

  // 7. 等待完成
  await expect(page.getByText('提取完成')).toBeVisible({ timeout: 30000 })

  // 8. 验证结果
  await expect(page.getByText('记录数:')).toBeVisible()
})

E2E 测试关键场景:

用户旅程 步骤数 预期时间 优先级
管理员完整工作流 15 < 60s P0
普通用户提取 8 < 45s P0
配置管理 10 < 30s P1
自动更新 8 < 90s P0
错误恢复 6 < 40s P1

5. 资源与工作量估算

5.1 人员配置建议

角色 人数 职责
测试开发工程师 2 人 单元测试、集成测试编写
全栈工程师 1 人 E2E 测试、Mock 基础设施
代码审查员 1 人 测试代码质量审查
总计 4 人 14 周完成

单人模式调整:

若只有 1 人负责,时间调整为:

  • 周投入20-25 小时
  • 总周期20-24 周
  • 优先级P0 → P1 → P2

5.2 工作量分解

阶段 任务 估算小时
Phase 1 ERP 服务单元测试 80-100
Mock 基础设施优化 10-15
Phase 2 数据库单元测试 60-80
配置单元测试 20-30
集成测试 20-30
Phase 3 更新服务测试 60-80
其他服务测试 40-50
Phase 4 E2E 测试 40-60
覆盖率优化 20-30
总计 350-475 小时

5.3 风险因素

风险 可能性 影响 缓解措施
Playwright 浏览器兼容性问题 提前验证浏览器版本
数据库连接不稳定 使用内存数据库或容器
Mock 与实现不同步 定期同步,添加类型检查
测试维护成本过高 使用工厂模式,避免硬编码
覆盖率工具性能影响 CI 中仅对变更文件检查

6. 成功度量标准

6.1 覆盖率指标

里程碑 总体行覆盖率 ERP 服务 更新服务 数据库
Phase 1 完成 25% 60% 50% 25%
Phase 2 完成 45% 65% 60% 60%
Phase 3 完成 65% 75% 80% 65%
Phase 4 完成 70% 80% 80% 70%

6.2 测试数量目标

类型 当前 Phase 1 Phase 2 Phase 3 Phase 4
单元测试文件 40 50 60 75 85
集成测试文件 7 8 12 15 20
E2E 测试文件 3 3 3 5 15
总测试文件 50 61 75 95 120

6.3 质量门禁

每个 PR 必须满足:

  1. 新增代码覆盖率 ≥ 80% (使用 vitest --coverage --changed)
  2. 无测试失败
  3. 测试执行时间 < 30s (单元测试) / < 120s (集成) / < 5min (E2E)
  4. 无 Mock 滥用 (真实逻辑必须有真实测试)

CI/CD 检查:

# GitHub Actions 示例
- name: Test & Coverage
  run: |
    npm run test:coverage
    # 检查覆盖率阈值
    npx vitest --coverage --thresholds
    # 生成报告
    npx vitest --coverage --reporter=html
    # 上传覆盖率
    uses: codecov/codecov-action@v4

7. 立即行动项(本周)

7.1 优先级 P0 - 必须完成

任务 负责人 截止日期 状态
创建 ERP Auth 测试文件框架 - Day 2
创建 Extractor Core 测试文件框架 - Day 3
扩展现有 Mock 库支持新增场景 - Day 4
运行首次覆盖率基准测试 - Day 1

7.2 优先级 P1 - 建议完成

任务 负责人 截止日期 状态
整理现有测试文件结构 - Day 3
创建测试模板和最佳实践文档 - Day 5
设置覆盖率 CI 报告 - Day 5

7.3 技术准备清单

# 1. 安装覆盖率报告工具
npm install --save-dev @vitest/coverage-v8

# 2. 运行基准测试
npm run test:coverage

# 3. 查看 HTML 报告
npm run test:coverage
# 打开 coverage/index.html

# 4. 按文件查看详细覆盖率
npx vitest --coverage --reporter=verbose

7.4 第一个 Sprint 目标Week 1-2

目标ERP Auth 测试完成 50%

  • tests/unit/services/erp/erp-auth.test.ts 创建
  • 成功登录场景测试3 个)
  • 失败场景测试5 个)
  • 会话管理测试3 个)
  • Mock 优化支持 Page 生命周期事件
  • 运行测试,覆盖率 ≥ 40%

附录

A. 现有测试资源

资源 路径 状态
测试设置 tests/setup.ts 完整 Electron Mock
测试工厂 tests/fixtures/factory.ts 8 个工厂类
Mock 库 tests/mocks/index.ts 15+ Mock 函数
测试文档 docs/TEST_FACTORY_USAGE.md 工厂使用指南
Mock 文档 docs/MOCK_LIBRARY_USAGE.md Mock 使用指南

B. 推荐测试工具

工具 用途
vitest 单元测试框架
@playwright/test E2E 测试框架
@vitest/coverage-v8 V8 覆盖率引擎
vitest-html-reporter HTML 报告生成

C. 相关文件

  • vitest.config.ts - Vitest 配置与覆盖率阈值
  • package.json - 测试脚本定义
  • .github/workflows/test.yml - CI 测试工作流

文档版本: 1.0
创建日期: 2026-04-05
最后更新: 2026-04-05
维护者: ERPAuto 开发团队