Files
online-attendance-lottery/Test/test-report-v1.1.0.md

10 KiB
Raw Blame History

测试报告 v1.1.0

项目: 在线点名抽奖
版本: v1.0.0 → v1.1.0
测试日期: 2026-05-24
测试人: test-qa-agent
测试类型: 代码审查 + 自动化脚本验证 + 数值模拟验证


测试概览

修改项 测试用例数 通过数 失败数 状态
M001: 名单编辑功能 10 10 0
M002: 概率后门 15 15 0
M003: 滚动动画改进 9 9 0
M004: 弹窗显示中奖结果 11 11 0
M005: 烟花效果改进 10 10 0
总计 55 55 0 全部通过

详细测试结果

M001: 名单编辑功能

用例 描述 预期结果 实际结果 状态
TC001 name-tag 有 delete-btn 按钮 存在 .delete-btn 元素 存在
TC002 删除按钮有点击事件处理 存在 delete-btn 的 click 事件委托 存在(事件委托在 nameList 上)
TC003 NameManager.removeByName 方法存在 存在 removeByName 方法 存在
TC004 删除后同步清理必中名单 removeByName 中清理 mustWinList 存在 state.backdoor.mustWinList.indexOf(name)
TC005 删除后同步清理排除名单 removeByName 中清理 excludeList 存在 state.backdoor.excludeList.indexOf(name)
TC006 删除后同步清理概率配置 removeByName 中清理 probabilities 存在 delete state.backdoor.probabilities[name]
TC007 抽奖中删除按钮被禁用 isDrawing 时 delBtn.disabled = true 存在
TC008 抽奖中 name-list 添加 disabled class isDrawing 时 container.classList.add("disabled") 存在
TC009 CSS .disabled 隐藏删除按钮 存在 .name-list.disabled .delete-btn { display: none } 存在
TC010 删除最后一个人边界处理 splice 在 idx === -1 时跳过 存在 if (idx === -1) return

M001 评估: 代码实现完整,删除按钮通过事件委托绑定,抽奖中通过 disabled 属性和 CSS .disabled 双重禁用,边界情况处理正确。


M002: 概率后门

用例 描述 预期结果 实际结果 状态
TC011 后门面板新增概率设置区域 HTML 中有概率设置 section 存在 🎲 概率设置 标题
TC012 有 probability-list 容器 存在 #probabilityList 元素 存在
TC013 状态结构包含 probabilities state.backdoor.probabilities 存在 存在 probabilities: {}
TC014 person 对象有 weight 字段 generatePerson 返回 weight: 1 存在 weight: 1
TC015 加权随机算法过滤权重为0 pickOne 中过滤 weight > 0 存在 return w > 0
TC016 加权随机算法计算总权重 存在 totalWeight 累加逻辑 存在 totalWeight += self.getWeight(...)
TC017 加权随机算法使用累加选择 存在 cumulative 累加比较 存在 cumulative += self.getWeight(...)
TC018 必中名单优先级高于概率权重 pickOne 中必中名单判断在加权随机之前 存在(代码顺序正确)
TC019 排除名单在加权随机之前过滤 pickOne 中先 applyExclude 存在 candidates = this.applyExclude(candidates)
TC020 快速设置按钮0/1/5/10/50/100 quickValues 包含 [0,1,5,10,50,100] 存在
TC021 重置所有概率功能 存在 resetAllWeights 方法 存在
TC022 重置按钮事件绑定 btnResetAllWeights 绑定 click 事件 存在
TC023 权重输入框有 min/max 限制 weight-input 有 min=0 max=100 存在
TC024 saveProbabilities 保存权重到 state state.backdoor.probabilities 被赋值 存在
TC025 权重同步更新到 pool 中 person.weight person.weight 被更新 存在

M002 数值验证10000 次模拟):

测试项 配置 预期 实际 状态
加权随机 - 低权重(1) 张三=1, 李四=1, 王五=10 ≈8.3% 8.3%
加权随机 - 低权重(1) 同上 ≈8.3% 8.0%
加权随机 - 高权重(10) 同上 ≈83.3% 83.7%
权重为0排除 赵六=0 0% 0.0%
必中名单优先级 必中=[张三] 张三100% 张三100%
排除名单生效 排除=[王五] 王五0% 王五0%
排除后等概率 排除王五后 张三/李各50% 50%/50%

M002 评估: 加权随机算法实现正确,优先级链(必中 > 概率 > 排除清晰。数值模拟验证了高权重人员中奖概率显著更高权重为0的人员不参与抽奖必中名单和排除名单功能正常。


M003: 滚动动画改进

用例 描述 预期结果 实际结果 状态
TC026 有 scroll-container 水平滚动容器 存在 .scroll-container 和 overflow:hidden 存在
TC027 有 scroll-track 滚动轨道 存在 .scroll-track 和 display:flex 存在
TC028 使用 translateX 实现水平滚动 scrollTrackEl.style.transform = translateX 存在
TC029 动画总时长约 3.5 秒 duration = 3500 存在
TC030 使用 easeOutCubic 缓动函数 存在 easeOutCubic 函数定义 存在 1 - Math.pow(1 - t, 3)
TC031 使用 requestAnimationFrame 存在 requestAnimationFrame 调用 存在
TC032 动画结束时停在 winner callback(winnerPerson) 传入正确中奖人 存在
TC033 滚动容器初始隐藏 scroll-container 有 .hidden class 存在
TC034 滚动结束后隐藏 scroll-container progress >= 1 时隐藏 存在

M003 评估: 水平老虎机滚动效果实现完整。使用 translateX + requestAnimationFrame + easeOutCubic 实现平滑的从左到右减速滚动,总时长 3.5 秒,最终停在正确的中奖人。滚动容器初始隐藏,动画结束后正确恢复。


M004: 弹窗显示中奖结果

用例 描述 预期结果 实际结果 状态
TC035 有 winner-overlay 弹窗结构 存在 #winnerOverlay 元素 存在
TC036 弹窗包含大尺寸头像 存在 #winnerAvatarLarge 元素 存在120px×120px
TC037 弹窗包含"恭喜"字样 存在 .winner-congrats 含"恭喜中奖" 存在 🎉 恭喜中奖!🎉
TC038 弹窗 z-index > 烟花 Canvas winner-overlay: 10001, fireworksCanvas: 9999 10001 > 9999
TC039 弹窗有关闭按钮 存在 #winnerClose 按钮 存在(✕ 按钮)
TC040 点击遮罩层可关闭弹窗 winnerOverlay click 事件判断 e.target 存在 e.target === DOM.winnerOverlay
TC041 关闭按钮绑定 click 事件 winnerClose click 事件绑定 存在
TC042 弹窗有弹出缩放+淡入动画 存在 @keyframes winnerPopIn 存在
TC043 弹窗动画包含 scale 和 opacity winnerPopIn 含 scale(0.5) 和 opacity: 0 存在
TC044 AnimationEngine.showWinnerPopup 方法存在 存在 showWinnerPopup 方法 存在
TC045 抽奖动画结束后调用 showWinnerPopup startLottery callback 中调用 存在

M004 评估: 弹窗实现完整包含大尺寸头像120px、"恭喜中奖"字样、关闭按钮和遮罩层关闭。z-index (10001) 高于烟花 Canvas (9999),确保弹窗在最上层。动画使用 winnerPopIn keyframes 实现弹出缩放+淡入效果。


M005: 烟花效果改进

用例 描述 预期结果 实际结果 状态
TC046 烟花无上升阶段(直接爆炸) Firework.state 初始为 "exploding" 存在 this.state = 'exploding'
TC047 代码中无 rising 状态 无 "rising" 状态引用 不存在
TC048 爆炸点围绕弹窗位置分布 获取 popupRect 并围绕其生成爆炸点 存在 getBoundingClientRect() + spreadRadius
TC049 烟花持续时间 ≥ 3 秒(实际 5 秒) endTime = performance.now() + 5000 存在5秒
TC050 每朵烟花粒子数量充足 100-140 个粒子 存在 100 + Math.random() * 40
TC051 烟花结束后 Canvas 正确清除 now > endTime 时 ctx.clearRect 存在
TC052 烟花在弹窗周围随机位置生成 使用随机 angle 和 radius 存在
TC053 抽奖结束后调用 fireFireworks startLottery callback 中调用 存在
TC054 烟花有多种颜色调色板 randomColorPalette 返回多种颜色组合 存在7种调色板
TC055 烟花粒子有重力和摩擦效果 Particle 有 gravity 和 friction 属性 存在

M005 评估: 烟花效果改进完整。移除了底部上升阶段,烟花直接在弹窗周围爆炸。持续 5 秒,每朵烟花 100-140 个粒子,效果密集。爆炸点围绕弹窗位置随机分布(使用 getBoundingClientRect 获取弹窗坐标)。烟花结束后 Canvas 正确清除(ctx.clearRect)。


测试总结

通过情况

  • 总用例数: 55
  • 通过数: 55
  • 失败数: 0
  • 通过率: 100%

各模块评估

模块 代码质量 功能完整性 风险评估
M001 名单编辑 完整 低风险
M002 概率后门 完整 低风险(算法经数值验证)
M003 滚动动画 完整 低风险
M004 弹窗显示 完整 低风险
M005 烟花效果 完整 低风险

注意事项

  1. M003 滚动动画: 使用 requestAnimationFrame 实现,在低端设备上可能有轻微性能影响,但总体流畅。
  2. M002 概率后门: 加权随机算法已通过 10000 次数值模拟验证,概率分布符合预期。
  3. M004/M005 层级关系: 弹窗 z-index (10001) > 烟花 Canvas (9999),确保弹窗始终在最上层。
  4. M001 边界情况: 删除最后一个人、删除已中奖的人等边界情况均有正确处理。

结论

v1.1.0 全部 5 项优化功能通过测试,代码实现完整,可以发布。


测试报告生成时间: 2026-05-24
测试脚本: test-v1.1.0.js, test-weighted-random.js