Files
ocean_project_manager/frontend/docs/test-cases.md
T
2026-01-26 08:04:53 +08:00

32 KiB
Raw Blame History

海洋项目管理系统 - 测试用例文档

目录

  1. 单元测试用例
  2. 集成测试用例
  3. E2E测试用例

1. 单元测试用例

1.1 工具函数测试

TC-001: formatMoney 函数测试

用例ID TC-001-01
测试模块 utils/format.js
测试函数 formatMoney
优先级
前置条件

测试场景

场景 输入 预期输出
正整数 1234 "1,234.00"
小数 1234.56 "1,234.56"
千分位 10000 "10,000.00"
0 "0.00"
负数 -1234.56 "-1,234.56"
四舍五入 100.123 "100.12"
大数字 9999999999 "9,999,999,999.00"

TC-002: formatPercentage 函数测试

用例ID TC-002-01
测试模块 utils/format.js
测试函数 formatPercentage
优先级
前置条件

测试场景

场景 输入 预期输出
50% 0.5 "50.00%"
100% 1 "100.00%"
0% 0 "0.00%"
小数 0.6666 "66.66%"
负数 -0.5 "-50.00%"

TC-003: formatDate 函数测试

用例ID TC-003-01
测试模块 utils/format.js
测试函数 formatDate
优先级
前置条件

测试场景

场景 输入 预期输出
日期字符串 "2026-01-25" "2026-01-25"
Date对象 new Date("2026-01-25") "2026-01-25"
时间戳 1706150400000 "2026-01-25"

TC-004: validateEmail 函数测试

用例ID TC-004-01
测试模块 utils/validate.js
测试函数 validateEmail
优先级
前置条件

测试场景

场景 输入 预期输出
有效邮箱 "test@example.com" true
有效邮箱(带点) "test.name@example.com" true
无效邮箱(无@ "testexample.com" false
无效邮箱(无域名) "test@" false
无效邮箱(无用户名) "@example.com" false
空字符串 "" false

TC-005: validatePhone 函数测试

用例ID TC-005-01
测试模块 utils/validate.js
测试函数 validatePhone
优先级
前置条件

测试场景

场景 输入 预期输出
有效手机号 "13800000001" true
有效手机号(其他运营商) "15900139000" true
无效手机号(太短) "1380000" false
无效手机号(太长) "138000000001" false
无效手机号(非数字) "138a0000001" false
空字符串 "" false

1.2 Hooks测试

TC-006: useAuth Hook 测试

用例ID TC-006-01
测试模块 hooks/useAuth.js
测试Hook useAuth
优先级
前置条件 AuthProvider包裹

测试场景

场景 操作 预期结果
初始状态 渲染组件 isAuthenticated=false, user=null, token=null
登录成功 调用login('admin', 'password123') isAuthenticated=true, user有值, token有值
登录失败 调用login('admin', 'wrong') isAuthenticated=false, 显示错误提示
登出 调用logout() isAuthenticated=false, user=null, token=null, localStorage清空
hasRole 调用hasRole(['admin']) 返回true或false
canEdit 调用canEdit(projectId) 根据角色和创建人返回true或false

TC-007: useTable Hook 测试

用例ID TC-007-01
测试模块 hooks/useTable.js
测试Hook useTable
优先级
前置条件

测试场景

场景 操作 预期结果
初始状态 初始化Hook pagination={current:1, pageSize:10}, filters={}, sorter={}
页码变化 调用handleTableChange({current:2}) pagination.current=2
筛选变化 调用handleTableChange({current:1}, {engineering_type:'基建'}) filters.engineering_type='基建'
排序变化 调用handleTableChange({current:1}, {}, {field:'signing_date', order:'desc'}) sorter.field='signing_date', sorter.order='desc'
重置 调用resetTable() 恢复初始状态
选择行 调用setSelectedRowKeys([1,2,3]) selectedRowKeys=[1,2,3]

TC-008: useDebounce Hook 测试

用例ID TC-008-01
测试模块 hooks/useDebounce.js
测试Hook useDebounce
优先级
前置条件

测试场景

场景 操作 预期结果
防抖生效 快速改变值3次 只返回最后一次的值,延迟300ms
默认延迟 不传delay参数 使用默认延迟300ms
自定义延迟 传入delay=500 使用自定义延迟500ms

1.3 组件测试

TC-009: Button 组件测试

用例ID TC-009-01
测试模块 components/Common/Button
测试组件 Button
优先级
前置条件

测试场景

场景 Props 预期结果
渲染按钮 children="点击我" 显示"点击我"文字
不同类型 type="primary" 蓝色按钮
不同类型 type="default" 白色按钮
不同类型 type="danger" 红色按钮
加载状态 loading=true 显示加载图标,禁用按钮
禁用状态 disabled=true 按钮不可点击
点击事件 onClick=mockFn 点击时调用mockFn

TC-010: Tag 组件测试

用例ID TC-010-01
测试模块 components/Common/Tag
测试组件 Tag
优先级
前置条件

测试场景

场景 Props 预期结果
渲染标签 children="基建" 显示"基建"文字
不同类型 type="new" 蓝色背景和文字
不同类型 type="inProgress" 绿色背景和文字
不同类型 type="completed" 灰色背景和文字
不同类型 type="cancelled" 红色背景和文字
自定义颜色 color="#ff0000" 使用自定义颜色

TC-011: StatCard 组件测试

用例ID TC-011-01
测试模块 components/Business/StatCard
测试组件 StatCard
优先级
前置条件

测试场景

场景 Props 预期结果
渲染卡片 title="项目总数", value=100 显示标题和数值
显示图标 icon="📊" 显示图标
前缀 prefix="¥" 数值前显示"¥"
后缀 suffix="万元" 数值后显示"万元"
金额格式化 value=1234.56 显示"1,234.56万元"

TC-012: Modal 组件测试

用例ID TC-012-01
测试模块 components/Common/Modal
测试组件 Modal
优先级
前置条件

测试场景

场景 Props 预期结果
显示模态框 visible=true 显示模态框
隐藏模态框 visible=false 不显示模态框
标题 title="新建项目" 显示标题
确定按钮 onOk=mockFn, okText="保存" 显示"保存"按钮,点击调用mockFn
取消按钮 onCancel=mockFn, cancelText="取消" 显示"取消"按钮,点击调用mockFn
加载状态 confirmLoading=true 确定按钮显示加载状态
自定义宽度 width={800} 宽度为800px
点击遮罩关闭 点击遮罩层 调用onCancel

1.4 API服务测试

TC-013: projectAPI 测试

用例ID TC-013-01
测试模块 services/project.js
测试API projectAPI
优先级
前置条件 模拟api.get/post/put/delete

测试场景

场景 调用 预期结果
获取列表 getList({page:1, pageSize:10}) api.get('/projects', {params:{page:1, pageSize:10}})
获取详情 getDetail(1) api.get('/projects/1')
创建项目 create({name:'新项目'}) api.post('/projects', {name:'新项目'})
更新项目 update(1, {name:'更新项目'}) api.put('/projects/1', {name:'更新项目'})
删除项目 delete(1) api.delete('/projects/1')
批量删除 batchDelete([1,2,3]) api.post('/projects/batch-delete', {ids:[1,2,3]})
获取统计 getStatistics() api.get('/projects/statistics')
获取分组统计 getGroupStatistics({groupBy:'engineering_type'}) api.get('/projects/statistics/group', {params:{groupBy:'engineering_type'}})
获取时间统计 getTimelineStatistics({timeField:'signing_date'}) api.get('/projects/statistics/timeline', {params:{timeField:'signing_date'}})
导出项目 export() api.get('/projects/export', {responseType:'blob'})

TC-014: userAPI 测试

用例ID TC-014-01
测试模块 services/user.js
测试API userAPI
优先级
前置条件 模拟api.get/post/put/delete

测试场景

场景 调用 预期结果
获取列表 getList({page:1, pageSize:10}) api.get('/users', {params:{page:1, pageSize:10}})
获取详情 getDetail(1) api.get('/users/1')
创建用户 create({username:'test'}) api.post('/users', {username:'test'})
更新用户 update(1, {realName:'新姓名'}) api.put('/users/1', {realName:'新姓名'})
删除用户 delete(1) api.delete('/users/1')
重置密码 resetPassword(1, 'newPassword') api.post('/users/1/reset-password', {new_password:'newPassword'})

2. 集成测试用例

2.1 页面组件测试

TC-015: Login 页面测试

用例ID TC-015-01
测试模块 pages/Login
测试页面 Login
优先级
前置条件

测试场景

场景 操作 预期结果
渲染登录页 访问/login 显示登录表单、Logo、用户名输入框、密码输入框、登录按钮
必填字段验证 不输入直接点击登录 显示"请输入用户名"和"请输入密码"错误
用户名太短 输入2个字符 显示"用户名至少3个字符"错误
密码太短 输入5个字符 显示"密码至少6个字符"错误
登录成功 输入正确用户名和密码,点击登录 调用login API,保存Token到localStorage,跳转到/dashboard
登录失败 输入错误密码,点击登录 显示"用户名或密码错误"提示
记住密码 勾选"记住密码",点击登录 localStorage保存用户名和密码(加密)
加载状态 点击登录按钮 按钮显示加载图标,禁用状态
Enter键提交 输入后按Enter键 触发登录

TC-016: Dashboard 页面测试

用例ID TC-016-01
测试模块 pages/Dashboard
测试页面 Dashboard
优先级
前置条件 已登录

测试场景

场景 操作 预期结果
渲染仪表盘 访问/dashboard 显示统计卡片、图表、最近项目列表
加载统计卡片 页面加载 调用getBasicStatistics API,显示4个统计卡片
加载图表 页面加载 调用getTimelineStatistics API,显示项目趋势图
加载最近项目 页面加载 调用getProjects API,显示最近5个项目
点击项目卡片 点击统计卡片 跳转到对应功能页面
点击最近项目 点击项目项 跳转到项目详情页
刷新数据 点击刷新按钮 重新获取所有数据
自动刷新 等待5分钟 自动刷新统计数据

TC-017: ProjectList 页面测试

用例ID TC-017-01
测试模块 pages/ProjectList
测试页面 ProjectList
优先级
前置条件 已登录

测试场景

场景 操作 预期结果
渲染列表页 访问/projects 显示工具栏、项目表格、分页控件
加载项目列表 页面加载 调用getList API,默认参数page=1, pageSize=10
搜索项目 输入关键词,按Enter 调用getList API,参数包含keyword
按工程类别筛选 选择"基建" 调用getList API,参数engineering_type='基建'
按日期筛选 选择日期范围 调用getList API,参数包含signing_date_start和signing_date_end
按金额筛选 输入金额范围 调用getList API,参数包含contract_amount_min和contract_amount_max
组合筛选 同时设置多个条件 调用getList API,所有条件AND关系
清除筛选 点击"清除"按钮 重置所有筛选条件,刷新列表
排序 点击表头"签订日期" 切换升序/降序,调用getList API,参数sort_by和sort_order
分页 点击页码 调用getList API,参数page更新
查看项目 点击"查看"按钮 跳转到/projects/:id
新建项目 点击"新建项目"按钮 打开新建项目模态框
编辑项目 点击"编辑"按钮 调用getDetail API,填充表单,打开编辑模态框
删除项目 点击"删除"按钮 显示确认对话框,确认后调用delete API
权限控制 市场部用户查看其他部门项目 "编辑"和"删除"按钮不显示
表格行点击 点击表格行 跳转到项目详情页

TC-018: ProjectDetail 页面测试

用例ID TC-018-01
测试模块 pages/ProjectDetail
测试页面 ProjectDetail
优先级
前置条件 已登录

测试场景

场景 操作 预期结果
渲染详情页 访问/projects/1 调用getDetail API,显示项目信息卡片
信息分组显示 页面加载 显示多个信息分组(基本信息、项目时间、成本管理等)
格式化金额 显示金额字段 千分位分隔,保留两位小数,单位"万元"
格式化日期 显示日期字段 格式为YYYY-MM-DD
编辑项目 点击"编辑"按钮 打开编辑模态框,填充当前数据
删除项目 点击"删除"按钮 显示确认对话框,确认后调用delete API,跳转到列表页
返回列表 点击面包屑"项目管理" 跳转到/projects
字段级权限 其他部门用户编辑 基础信息字段只读,其他字段可编辑
金额计算 修改成本字段 自动计算总成本控制金额
进度计算 修改进度字段 自动更新进度百分比

TC-019: UserList 页面测试

用例ID TC-019-01
测试模块 pages/UserList
测试页面 UserList
优先级
前置条件 已登录,管理员角色

测试场景

场景 操作 预期结果
渲染用户列表 访问/users 显示工具栏、用户表格、分页控件
加载用户列表 页面加载 调用getUsers API
搜索用户 输入关键词,按Enter 调用getUsers API,参数包含keyword
按部门筛选 选择"市场部" 调用getUsers API,参数department='市场部'
按角色筛选 选择"admin" 调用getUsers API,参数role='admin'
新建用户 点击"新建用户"按钮 打开新建用户模态框
编辑用户 点击"编辑"按钮 调用getUserDetail API,填充表单,打开编辑模态框
用户名只读 编辑模式 用户名字段禁用,不可修改
删除用户 点击"删除"按钮 显示确认对话框,确认后调用delete API
重置密码 点击"重置密码"按钮 显示重置密码对话框,输入新密码后调用resetPassword API
权限控制 非管理员用户访问 重定向到403页或显示权限错误

2.2 交互流程测试

TC-020: 完整的项目创建流程测试

用例ID TC-020-01
测试模块 交互流程
测试场景 项目创建流程
优先级
前置条件 已登录,有创建项目权限

测试步骤

步骤 操作 预期结果
1 访问/projects 显示项目列表页
2 点击"新建项目"按钮 打开新建项目模态框
3 输入合同编号"PRJ001" 输入框显示"PRJ001"
4 输入项目名称"测试项目" 输入框显示"测试项目"
5 选择工程类别"基建" 下拉框显示"基建"
6 输入合同金额"100" 输入框显示"100"
7 选择签订日期"2026-01-25" 日期选择器显示"2026-01-25"
8 不输入必填字段,点击保存 显示必填字段验证错误
9 填写所有必填字段,点击保存 调用create APIloading=true
10 API返回成功 模态框关闭,列表刷新,显示成功提示"项目创建成功"
11 API返回失败(合同编号重复) 显示错误提示"合同编号已存在"
12 新项目出现在列表中 列表第一行显示新项目

TC-021: 完整的项目编辑流程测试

用例ID TC-021-01
测试模块 交互流程
测试场景 项目编辑流程
优先级
前置条件 已登录,有编辑权限

测试步骤

步骤 操作 预期结果
1 访问/projects 显示项目列表页
2 找到项目PRJ001 列表显示该项目
3 点击"编辑"按钮 调用getDetail API,打开编辑模态框
4 表单填充当前数据 输入框显示项目当前值
5 修改项目名称为"更新项目" 输入框显示"更新项目"
6 修改合同金额为"200" 输入框显示"200"
7 点击保存 调用update APIloading=true
8 API返回成功 模态框关闭,列表刷新,显示成功提示"项目更新成功"
9 API返回失败 显示错误提示
10 列表显示更新后的数据 项目名称和金额更新

TC-022: 完整的项目删除流程测试

用例ID TC-022-01
测试模块 交互流程
测试场景 项目删除流程
优先级
前置条件 已登录,有删除权限

测试步骤

步骤 操作 预期结果
1 访问/projects 显示项目列表页
2 找到项目PRJ001 列表显示该项目
3 点击"删除"按钮 显示确认对话框,内容"确定要删除该项目吗?"
4 点击"取消"按钮 对话框关闭,项目不被删除
5 再次点击"删除"按钮 显示确认对话框
6 点击"确定"按钮 调用delete API
7 API返回成功 列表刷新,显示成功提示"项目删除成功",项目从列表消失
8 API返回失败 显示错误提示
9 项目不存在 显示404错误提示

3. E2E测试用例

3.1 认证流程E2E测试

TC-E2E-001: 登录流程E2E测试

用例ID TC-E2E-001
测试模块 登录流程
测试类型 E2E
优先级
前置条件 后端服务运行,测试账号存在

测试场景

场景 步骤 预期结果
正常登录 1. 访问http://localhost:3000
2. 输入用户名"admin"
3. 输入密码"password123"
4. 点击登录按钮
1. 显示登录页
2. 自动跳转到/dashboard
3. 顶部导航显示用户信息"系统管理员(管理部)"
登录失败 1. 访问登录页
2. 输入正确用户名
3. 输入错误密码
4. 点击登录按钮
1. 显示错误提示"用户名或密码错误"
2. 停留在登录页
3. 输入框保留输入值
字段验证 1. 访问登录页
2. 不输入任何内容
3. 点击登录按钮
1. 用户名和密码输入框显示红色边框
2. 显示"请输入用户名"和"请输入密码"提示
3. 登录按钮无法提交
记住密码 1. 勾选"记住密码"
2. 输入用户名和密码
3. 点击登录
4. 刷新页面
1. 用户名和密码自动填充
2. 复选框保持选中

TC-E2E-002: 登出流程E2E测试

用例ID TC-E2E-002
测试模块 登出流程
测试类型 E2E
优先级
前置条件 已登录

测试场景

场景 步骤 预期结果
登出 1. 点击顶部导航"登出"按钮
2. 点击确认对话框"确定"按钮
1. 显示确认对话框"确定要退出登录吗?"
2. 跳转到/login
3. localStorage清空
取消登出 1. 点击"登出"按钮
2. 点击"取消"按钮
1. 对话框关闭
2. 保持在当前页面,保持登录状态

3.2 项目管理E2E测试

TC-E2E-003: 项目列表E2E测试

用例ID TC-E2E-003
测试模块 项目列表
测试类型 E2E
优先级
前置条件 已登录

测试场景

场景 步骤 预期结果
浏览列表 1. 点击侧边栏"项目管理"
2. 等待页面加载
3. 查看项目表格
1. 跳转到/projects
2. 显示项目表格
3. 表格显示项目数据,每页10条
分页浏览 1. 点击"下一页"按钮
2. 点击第3页
3. 点击"上一页"
1. 显示第2页数据
2. 显示第3页数据
3. 显示第2页数据
搜索项目 1. 在搜索框输入"基建"
2. 按Enter键
1. 表格只显示包含"基建"的项目
2. 显示搜索结果数量
筛选项目 1. 点击"工程类别"下拉框
2. 选择"基建"
3. 点击"签订日期"日期选择器
4. 选择日期范围
5. 点击"确定"
1. 表格只显示基建项目
2. 签订日期在范围内的项目
清除筛选 1. 设置多个筛选条件
2. 点击"清除"按钮
1. 所有筛选条件清空
2. 列表显示所有数据

TC-E2E-004: 项目创建E2E测试

用例ID TC-E2E-004
测试模块 项目创建
测试类型 E2E
优先级
前置条件 已登录,有创建项目权限

测试场景

场景 步骤 预期结果
创建项目 1. 访问/projects
2. 点击"新建项目"按钮
3. 输入合同编号"PRJ999"
4. 输入项目名称"E2E测试项目"
5. 选择工程类别"基建"
6. 输入合同金额"100"
7. 选择签订日期"2026-01-25"
8. 点击"保存"按钮
9. 等待API响应
1. 打开新建项目模态框
2. 模态框标题"新建项目"
3-7. 所有输入框显示输入值
8. 按钮显示loading状态
9. 模态框关闭
10. 显示成功提示"项目创建成功"
11. 列表第一行显示新项目
验证失败创建 1. 点击"新建项目"
2. 不输入必填字段
3. 点击"保存"
1. 必填字段显示红色边框
2. 显示错误提示
3. 模态框不关闭

TC-E2E-005: 项目编辑E2E测试

用例ID TC-E2E-005
测试模块 项目编辑
测试类型 E2E
优先级
前置条件 已登录,有编辑权限

测试场景

场景 步骤 预期结果
编辑项目 1. 访问/projects
2. 找到项目PRJ001
3. 点击"编辑"按钮
4. 修改项目名称为"E2E更新项目"
5. 修改合同金额为"200"
6. 点击"保存"按钮
7. 等待API响应
1. 打开编辑项目模态框
2. 模态框标题"编辑项目"
3. 表单填充当前数据
4-5. 输入框显示新值
6. 按钮显示loading状态
7. 模态框关闭
8. 显示成功提示"项目更新成功"
9. 列表显示更新后的数据
权限限制编辑 1. 其他部门用户登录
2. 编辑项目PRJ001
3. 查看表单字段
1. 基础信息字段(合同编号、项目名称等)只读
2. 成本、财务等字段可编辑

TC-E2E-006: 项目删除E2E测试

用例ID TC-E2E-006
测试模块 项目删除
测试类型 E2E
优先级
前置条件 已登录,有删除权限

测试场景

场景 步骤 预期结果
删除项目 1. 访问/projects
2. 找到项目PRJ999
3. 点击"删除"按钮
4. 查看确认对话框内容
5. 点击"确定"按钮
6. 等待API响应
1. 显示确认对话框
2. 对话框内容"确定要删除该项目吗?"
3. 显示项目名称和合同编号
4. 点击"确定"后
5. 显示成功提示"项目删除成功"
6. 列表刷新,项目消失
取消删除 1. 点击"删除"按钮
2. 点击"取消"按钮
1. 对话框关闭
2. 项目不被删除,仍在列表中

3.3 用户管理E2E测试

TC-E2E-007: 用户列表E2E测试

用例ID TC-E2E-007
测试模块 用户列表
测试类型 E2E
优先级
前置条件 已登录,管理员角色

测试场景

场景 步骤 预期结果
浏览用户列表 1. 点击侧边栏"用户管理"
2. 等待页面加载
1. 跳转到/users
2. 显示用户表格
3. 表格显示所有用户
搜索用户 1. 在搜索框输入"admin"
2. 按Enter键
1. 表格只显示匹配的用户
按部门筛选 1. 点击"部门"下拉框
2. 选择"市场部"
1. 表格只显示市场部用户
按角色筛选 1. 点击"角色"下拉框
2. 选择"admin"
1. 表格只显示管理员用户

TC-E2E-008: 用户创建E2E测试

用例ID TC-E2E-008
测试模块 用户创建
测试类型 E2E
优先级
前置条件 已登录,管理员角色

测试场景

场景 步骤 预期结果
创建用户 1. 访问/users
2. 点击"新建用户"按钮
3. 输入用户名"testuser"
4. 输入密码"password123"
5. 输入真实姓名"测试用户"
6. 选择部门"管理部"
7. 选择角色"admin"
8. 点击"保存"按钮
9. 等待API响应
1. 打开新建用户模态框
2. 模态框标题"新建用户"
3-7. 所有输入框显示输入值
8. 按钮显示loading状态
9. 模态框关闭
10. 显示成功提示"用户创建成功"
11. 列表显示新用户
用户名重复 1. 创建用户,用户名"admin"
2. 点击"保存"
1. 显示错误提示"用户名已存在"
2. 模态框不关闭

TC-E2E-009: 用户编辑E2E测试

用例ID TC-E2E-009
测试模块 用户编辑
测试类型 E2E
优先级
前置条件 已登录,管理员角色

测试场景

场景 步骤 预期结果
编辑用户 1. 访问/users
2. 找到用户testuser
3. 点击"编辑"按钮
4. 修改真实姓名为"测试用户更新"
5. 修改邮箱为新邮箱
6. 点击"保存"按钮
7. 等待API响应
1. 打开编辑用户模态框
2. 用户名字段只读
3. 其他字段可编辑
4-5. 输入框显示新值
6. 按钮显示loading状态
7. 模态框关闭
8. 显示成功提示
9. 列表显示更新后的数据

TC-E2E-010: 用户删除E2E测试

用例ID TC-E2E-010
测试模块 用户删除
测试类型 E2E
优先级
前置条件 已登录,管理员角色

测试场景

场景 步骤 预期结果
删除用户 1. 访问/users
2. 找到用户testuser
3. 点击"删除"按钮
4. 点击"确定"按钮
5. 等待API响应
1. 显示确认对话框
2. 点击"确定"后
3. 显示成功提示"用户删除成功"
4. 列表刷新,用户消失

TC-E2E-011: 重置密码E2E测试

用例ID TC-E2E-011
测试模块 重置密码
测试类型 E2E
优先级
前置条件 已登录,管理员角色

测试场景

场景 步骤 预期结果
重置密码 1. 访问/users
2. 找到用户testuser
3. 点击"重置密码"按钮
4. 输入新密码"newpassword123"
5. 点击"确定"按钮
6. 等待API响应
1. 显示重置密码对话框
2. 输入框显示新密码
3. 点击"确定"后
4. 显示成功提示"密码重置成功"

3.4 统计分析E2E测试

TC-E2E-012: 仪表盘E2E测试

用例ID TC-E2E-012
测试模块 仪表盘
测试类型 E2E
优先级
前置条件 已登录

测试场景

场景 步骤 预期结果
查看仪表盘 1. 访问/dashboard
2. 等待页面加载
1. 显示4个统计卡片
2. 显示项目趋势图
3. 显示最近项目列表
查看统计卡片 1. 查看统计卡片数据 1. 项目总数、进行中、已完成、总合同金额
2. 数值格式化(千分位、保留两位小数)
查看图表 1. 鼠标悬停在图表上 1. 显示Tooltip,显示详细数据
点击最近项目 1. 点击最近项目列表项 1. 跳转到项目详情页
刷新数据 1. 点击刷新按钮 1. 重新获取所有数据

TC-E2E-013: 项目统计E2E测试

用例ID TC-E2E-013
测试模块 项目统计
测试类型 E2E
优先级
前置条件 已登录

测试场景

场景 步骤 预期结果
查看统计页 1. 点击侧边栏"项目统计"
2. 等待页面加载
1. 显示筛选工具栏
2. 显示统计图表
3. 显示分组统计表格
基础统计 1. 查看基础统计卡片 1. 显示8个统计卡片
2. 数值格式化
分组统计 1. 查看按工程类别分组 1. 显示饼图和柱状图
2. 显示分组统计表格
时间维度统计 1. 选择时间维度"按月"
2. 查看折线图
1. 显示每月项目数量和金额趋势
筛选统计 1. 选择工程类别"基建"
2. 选择日期范围
1. 所有统计只显示符合条件的数据
导出报表 1. 点击"导出报表"按钮
2. 等待下载完成
1. 下载Excel文件
2. 文件名"项目统计_YYYY-MM-DD.xlsx"

4. 测试数据准备

4.1 测试用户数据

const testUsers = [
  {
    id: 1,
    username: 'admin',
    password: 'password123',
    real_name: '系统管理员',
    department: '管理部',
    role: 'admin',
    email: 'admin@example.com',
    is_active: true,
  },
  {
    id: 2,
    username: 'market',
    password: 'password123',
    real_name: '市场部用户',
    department: '市场部',
    role: 'market',
    email: 'market@example.com',
    is_active: true,
  },
  {
    id: 3,
    username: 'other',
    password: 'password123',
    real_name: '其他部门用户',
    department: '技术部',
    role: 'other',
    email: 'other@example.com',
    is_active: true,
  },
];

4.2 测试项目数据

const testProjects = [
  {
    id: 1,
    project_no: 'PRJ001',
    name: '某电力基建工程项目',
    engineering_type: '基建',
    contract_amount: 950.00,
    signing_date: '2026-01-01',
    start_date: '2026-01-15',
    planned_end_date: '2026-12-31',
    project_department: '项目部一',
    project_leader: '李四',
    created_by: 2,
  },
  {
    id: 2,
    project_no: 'PRJ002',
    name: '业扩工程项目',
    engineering_type: '业扩',
    contract_amount: 500.00,
    signing_date: '2026-01-10',
    start_date: '2026-01-20',
    planned_end_date: '2026-06-30',
    project_department: '项目部二',
    project_leader: '王五',
    created_by: 2,
  },
];

5. 测试覆盖率目标

类型 目标覆盖率
语句覆盖率 80%
分支覆盖率 75%
函数覆盖率 80%
行覆盖率 80%

文档维护: 前端程序员 文档类型: 测试用例文档 最后更新: 2026-01-25