- 删除旧的 AI03 课程文件(第4-5课) - 新增 AICODE-03 课程体系(AI是怎么想的、AI训练师、我是大作家等) - 新增 AICODE-06 课程体系(从扣子到代码、个人主页、涂鸦PK等)
665 lines
38 KiB
Markdown
665 lines
38 KiB
Markdown
---
|
||
课时: 7
|
||
主题: 魔幻俄罗斯方块(下)— 魔改升级 + AI 自动测试
|
||
核心能力: [拆解力, 共创力, 韧性力]
|
||
核心工具: [Kimi 2.5]
|
||
时长: 90分钟
|
||
透明化层级: 过程层
|
||
适用路线: AICODE-06
|
||
---
|
||
|
||
### 1. 课程目标
|
||
|
||
**知识目标:**
|
||
- 理解「自动化测试」的概念:不靠人工玩,让代码自己验证代码,更快更全面
|
||
- 理解「测试覆盖」:需求文档里每一条规则,都应该有一条对应的测试
|
||
- 理解功能扩展的增量思维:新功能只写「增量」,不重写整体
|
||
|
||
**能力目标:**
|
||
- 能把需求文档转化为测试条件,交给 AI 生成测试脚本(拆解力)
|
||
- 能读懂测试脚本的 ✅❌ 结果,把失败的测试溯源到需求文档(韧性力)
|
||
- 能独立完成「需求 → 审核 → 生成 → 测试 → 修复」完整闭环(共创力)
|
||
|
||
**情感目标:**
|
||
- 体验「一键跑测试,马上知道哪里有问题」带来的效率感
|
||
- 建立「测试通过才算完成,不是能玩就算完成」的质量意识
|
||
- 感受从「每次手动点来点去找 bug」到「测试脚本自动找 bug」的升级
|
||
|
||
---
|
||
|
||
### 2. 核心概念与误概念预设
|
||
|
||
**核心概念认知层级:**
|
||
|
||
| 概念 | 学生类比 | 认知层级 |
|
||
|------|---------|---------|
|
||
| 自动化测试 | 与其自己每次手动检查作业有没有写对,不如写一个「答案核对程序」,把你的答案输进去,自动判断对错 | 理解层 |
|
||
| 测试覆盖 | 需求文档里写了10条规则,测试脚本就要测10件事——少测一条,那条出了 bug 你就不知道 | 应用层 |
|
||
| 边界条件 | 不只测「正常情况」,还要测「极端情况」——比如方块刚好在边角旋转、同时消4行、积木堆到最顶 | 应用层 |
|
||
| 增量需求文档 | 只写「新加的部分」,不重写整体——就像给手机升级系统,不是重新买一台手机 | 理解层 |
|
||
| 新窗口原则 | 让同一个人既写方案又审方案,他永远找不出大问题——审核和测试必须开新窗口,让没有上下文的新 AI 来做,才能客观找出漏洞 | 应用层 |
|
||
|
||
**典型误概念表:**
|
||
|
||
| 编号 | 误概念 | 正确认知 | 激发策略 |
|
||
|------|--------|---------|---------|
|
||
| M1 | 测试就是自己玩一遍,没出问题就算通过 | 手动测试只能发现你刚好测到的问题;自动测试每次都覆盖所有条件,不会遗漏 | 「你刚才玩的时候,有没有特意测『同时消4行的得分是不是800』?」 |
|
||
| M2 | 测试脚本是程序员才会写的东西 | 把你的需求文档给 AI,AI 就能帮你把每条需求变成一个测试 | 现场演示:需求文档→AI→测试脚本,5分钟完成 |
|
||
| M3 | 加新功能要把整个游戏重新做一遍 | 增量需求文档只写新加的部分,在已有代码上加,不是重做 | 演示增量需求文档的写法 |
|
||
| M4 | 测试通过了就说明没有 bug | 测试只能覆盖你想到的情况;没覆盖的情况仍然可能有 bug——所以需求文档要写详细 | 「你的测试脚本有没有测『反重力期间消行』?」 |
|
||
| M5 | 测试失败说明代码写错了 | 测试失败可能是代码问题,也可能是需求文档没说清楚——先溯源,再决定改哪里 | 展示一个「测试失败但代码没错,是需求文档漏写了」的案例 |
|
||
| M6 | 需求审核、测试脚本生成可以在写需求的同一个窗口里做 | 上下文污染——AI 会受之前对话影响,不会客观审核自己生成的东西。审核和测试必须开新窗口 | 演示:同一窗口让 AI 审核自己写的需求,回答很保守;新窗口审核,问题暴露更多 |
|
||
|
||
---
|
||
|
||
### 3. 教学准备
|
||
|
||
**工具与环境:**
|
||
- 每台电脑已登录 Kimi 2.5,网络正常
|
||
- 学生上节课(第6课)完成的俄罗斯方块 HTML 文件保存在桌面
|
||
- 投影可切换至任意学生屏幕
|
||
- 准备路演计时器(3分钟倒计时)
|
||
|
||
**教学资源:**
|
||
- 教师准备:增量需求文档模板(见第5节)
|
||
- 教师准备:生成测试脚本的提示词(见第5节)
|
||
- 教师准备:一份提前生成好的测试脚本演示(包含1个 ✅ 和1个 ❌,用于导入展示)
|
||
- 教师准备:功能灵感参考清单(见第5节)
|
||
- 教师准备:路演结构引导卡(见第5节)
|
||
- 学生资源:第6课完成的俄罗斯方块 HTML 文件 + Level 0 需求文档
|
||
|
||
**教师备课体验任务:**
|
||
> 备课前,教师必须亲自完成以下操作:
|
||
>
|
||
> 1. 用自己的俄罗斯方块代码 + 需求文档,让 Kimi 生成测试脚本,实际运行并记录结果
|
||
> 2. 故意在需求文档里漏写一条规则,观察测试脚本是否能发现对应的 bug
|
||
> 3. 准备一个演示用的「测试结果页面」,包含至少1个 ✅ 和1个 ❌,用于课堂导入
|
||
> 4. 提前试跑「炸弹方块」功能的增量需求文档完整流程,记录 AI 审核会问什么问题
|
||
|
||
---
|
||
|
||
### 4. 教学流程
|
||
|
||
---
|
||
|
||
**第一幕:联系 (Connect) — 10分钟** 🔗
|
||
|
||
*本幕目标:用每人的功能构想激活学生兴趣,制造「今天不只是加功能,还要学一个新技能」的认知悬念*
|
||
|
||
**【环节】上节课回顾 (4分钟)**
|
||
|
||
**师:** 上节课结束前,我让你们想一个今天要加的功能,而且在出门前每人说了一句话。我们来回顾一下——上节课我们用了 Plan Mode,它有几步?谁来说?
|
||
【诊断点:检测 Plan Mode 三步流程的记忆保持度】【识别层】
|
||
|
||
**生:** (预期:打开 Plan Mode → 写需求文档 → 让 AI 审核……)
|
||
|
||
**【分支A】若学生能说出三步(写文档、审核、执行):**
|
||
**师:** 说得很准。今天还是这三步,但是有一点不一样——今天写的是「增量需求文档」,不是重新写整个游戏。等会儿我会解释区别在哪里。
|
||
|
||
**【分支B】若学生只说出一两步:**
|
||
**师:** 没关系,我帮你补一下。Plan Mode 三步:第一步,写需求文档,把你想做的东西说清楚;第二步,需求审核,让 AI 扮演审核工程师找漏洞;第三步,执行,生成代码。今天还是这三步,我们继续。
|
||
|
||
**师:** 好,现在说说你想加的功能——每人说一个,我把它们写在黑板上。
|
||
【每人快速说一个,教师写在白板/投屏上,列成一列】
|
||
|
||
**生:** (各自说出功能:炸弹方块、速度加成、冻结方块、彩虹消行……)
|
||
|
||
**师:** 大家看一下黑板——(指着功能列表)这里有六个不同的功能方向,没有两个人做一样的。你们今天各自在做一个完全不同的版本。
|
||
|
||
**师:** 我们来做一件有趣的事——互相评一下别人的功能想法。你觉得黑板上哪一个功能听起来最难描述清楚?
|
||
**生:** (讨论,指出某个功能)
|
||
**师:** 为什么觉得难?
|
||
**生:** (例如:「重力反转不知道要怎么写规则」「炸弹不知道爆炸范围算不算消行」)
|
||
**师:** 你们刚才说的这些「不知道」,就是今天需求文档里必须写清楚的部分。不写清楚,AI 就会自己决定,结果可能跟你想的完全不一样。
|
||
|
||
**【环节】引发认知冲突 + 悬念铺垫 (6分钟)**
|
||
|
||
**师:** 我再问你们——你刚才说想加的功能,你觉得最难描述清楚的规则是哪一条?比如你想加炸弹方块,「炸弹爆炸」这件事,你要怎么告诉 AI?
|
||
【诊断点:探测学生对「把直觉转化为精确规则」的困难点认知】【理解层】
|
||
|
||
**生:** (各自说出难点——爆炸范围?爆炸后消行吗?得分怎么算?)
|
||
|
||
**师:** 很好,你已经在思考这个问题了。等会儿写需求文档的时候,那条规则要特别仔细。
|
||
|
||
**师:** 今天除了加功能,我们还会学一个新技能。上节课你们手动测试游戏——自己玩、自己找 bug,对吗?手动测试有一个问题,一会儿让你们自己感受。
|
||
【故意不展开,制造悬念】
|
||
|
||
**师:** 我问你们——你的游戏有5条规则,你在手动测的时候,你能保证5条都测到了吗?
|
||
**生:** (预期:不一定……有点难……)
|
||
**师:** 等会儿让你们亲身体验这个问题,我们先进建构。
|
||
|
||
**师:** 打开你上节课的游戏文件,确认能正常运行。我们进入建构阶段。
|
||
|
||
---
|
||
|
||
**第二幕:建构 (Construct) — 65分钟** 🛠️
|
||
|
||
---
|
||
|
||
**【分段一:增量需求文档 + 需求审核】(15分钟)**
|
||
|
||
*本段重点:理解「增量」思维,写出可测试的需求文档,尤其是交互规则和验收标准*
|
||
|
||
**预设误概念:**
|
||
- 误概念 M3:加新功能要把整个游戏重做
|
||
- 误概念:验收标准可以写成「功能正常」这种模糊的话
|
||
|
||
**讲解与演示 (Teach & Demo): (5分钟)**
|
||
|
||
**师:** 今天继续用 Plan Mode。但今天写的是「增量需求文档」——只写新加的部分,不重写整个游戏。
|
||
|
||
**师:** 类比一下——你手机升级系统,是重新买一台手机,还是只更新改变的那一部分?
|
||
**生:** (预期:只更新改变的部分)
|
||
**师:** 对。增量需求文档就是这个意思:你的游戏核心逻辑不动,你只描述「要在这个基础上加什么」。
|
||
|
||
**师:** 增量需求文档有一个特别重要的部分,叫「与原有功能的交互规则」。我举一个具体例子——你加了炸弹方块。炸弹落地,爆炸了。爆炸之后刚好把整行都消干净了——这算消行吗?得多少分?是按炸弹规则算,还是按消行规则算,还是两个叠加?
|
||
|
||
**师:** 如果你没写清楚,AI 自己决定,结果可能跟你想的完全不一样。所以交互规则必须写。
|
||
|
||
**师:** 还有一个字段叫「验收标准」。它的格式是这样的:
|
||
**「[情况] → [预期结果]」**
|
||
比如:「炸弹落地时周围没有积木 → 爆炸动画播放,得分+50,无消行」。
|
||
验收标准必须是可以测试的——能测试 = 说清楚了具体情况,说清楚了预期结果。不能写「功能正常运行」,那不是验收标准,那是废话。
|
||
|
||
**师:** 我来考考你们——以下两条验收标准,哪条是可测试的?
|
||
- A:「炸弹功能运行正常」
|
||
- B:「炸弹落地后,落点周围3×3格内的积木清除,得分+50」
|
||
|
||
**生:** (预期:B)
|
||
**师:** 对,B 是可测试的——它告诉了 AI「清除3×3范围」和「+50分」。A 是废话——AI 不知道「正常」是什么意思。你的验收标准必须全部像 B 这样写。
|
||
【投屏展示增量需求文档模板,见第5节】
|
||
|
||
**学生实践 (Practice): (8分钟)**
|
||
|
||
1. 学生填写增量需求文档(重点:功能规则 + 交互规则 + 验收标准)
|
||
2. **⚠️ 开新窗口**:复制需求文档内容,打开全新的 Kimi 对话,执行「需求审核」提示词
|
||
- 不能在写需求的同一个窗口里审核——AI 会受上下文影响,不会客观指出问题
|
||
3. 回答 AI 的问题,把答案补充进需求文档(回到原来的窗口补充)
|
||
|
||
> 教师走动:检查以下三项——是否写了「与原有功能的交互规则」?验收标准是否是「情况 → 预期结果」格式?验收标准条数是否至少3条?
|
||
|
||
**进度同步 (Checkpoint): (2分钟)**
|
||
|
||
**师:** AI 审核出了什么?有没有让你意外的问题?
|
||
**生:** (分享,例如:「AI 问我炸弹同时触发消行怎么算」)
|
||
|
||
**【分支A】若学生说 AI 问出了没想到的问题:**
|
||
**师:** 这个问题你之前有想到吗?
|
||
**生:** 没有……
|
||
**师:** 所以 AI 审核是真的有用的——它问的问题不是废话,是你确实需要回答的问题。
|
||
|
||
**【分支B】若学生说 AI 没审出什么问题:**
|
||
**师:** 把你的需求文档发我看一下。(观察)——你的验收标准里有没有写边界情况?比如「功能触发时恰好也消行」这种情况?如果没有,让 AI 专门针对边界情况再审一遍。
|
||
|
||
**师:** 好,需求文档基本确认了,进入执行阶段。
|
||
|
||
---
|
||
|
||
**【分段二:生成第一版 → 手动测试 → 感受痛点】(15分钟)**
|
||
|
||
*本段重点:先让学生亲身体验手动测试的局限,再自然引出「让电脑帮我们测」的需求*
|
||
|
||
**预设误概念:**
|
||
- 误概念 M1:手动玩一遍没出问题就算通过
|
||
- 误概念:测试只需要测「好不好玩」,不需要逐条对照需求
|
||
|
||
**讲解与演示 (Teach & Demo): (2分钟)**
|
||
|
||
**师:** 把确认好的增量需求文档提交 Kimi,基于上节课的代码增加新功能。
|
||
【投屏展示「增量生成」提示词,见第5节】
|
||
|
||
**师:** 生成之后,先手动测几条——自己玩一玩,看看新功能有没有按需求做出来。特别注意:不是随便玩,是对照着你的验收标准一条条测。
|
||
|
||
**学生实践 (Practice): (10分钟)**
|
||
|
||
1. 提交增量需求文档 + 旧代码给 Kimi,生成第一版
|
||
2. 打开游戏,手动测试:新功能触发了吗?原有消行/得分还正常吗?
|
||
3. 对照验收标准逐条检查,记录发现的问题
|
||
|
||
> 教师走动观察:故意不干预,让学生自己感受「手动测试的局限」。观察:是否有学生只是「玩了一会儿」而没有逐条对照验收标准?是否有学生根本没有测「新功能和消行同时触发」的边界情况?是否有学生测了3条就觉得「差不多了」?
|
||
|
||
**进度同步 (Checkpoint): (3分钟)**
|
||
|
||
**师:** 手动测了哪几条?对照你的验收标准,你测了几条?
|
||
**生:** (预期:2条、3条……)
|
||
|
||
**师:** 你的验收标准里一共有几条?
|
||
**生:** 5条……
|
||
|
||
**师:** 你测了3条,还有2条没测。你确定那2条没有问题吗?
|
||
**生:** 不确定……
|
||
|
||
**师:** 还有一个问题——就算今天你把所有5条都测了,下次你改了代码,你还要重新手动测一遍。如果你做了第二版、第三版,每次都要从头手动测一遍。需求文档越来越长,要测的条数越来越多,手动测试需要的时间也越来越长。
|
||
|
||
**师:** 有没有办法,让电脑帮我们测,而且每次都自动把所有条件测完?
|
||
|
||
**【分支A】若有学生说「那肯定有程序能做这个」:**
|
||
**师:** 你说对了!这个东西叫测试脚本。我们现在就去做一个。
|
||
|
||
**【分支B】若学生面面相觑,不知道答案:**
|
||
**师:** 答案就是——用 AI 帮我们写一个测试脚本。这个脚本会自动运行你的游戏逻辑,逐条对照需求文档,告诉你哪条通过了、哪条失败了。我来给你们看一下它长什么样。
|
||
|
||
---
|
||
|
||
**【分段三:AI 生成测试脚本 → 跑测试 → 修复】(25分钟)**
|
||
|
||
*本段重点:生成并运行测试脚本,学会读懂 ✅❌ 结果并溯源,建立「测试才算完成」的质量意识*
|
||
|
||
**预设误概念:**
|
||
- 误概念 M2:测试脚本是程序员才会写的
|
||
- 误概念 M5:测试失败说明代码写错了,不可能是需求问题
|
||
- 误概念:看不懂代码就没法用测试脚本
|
||
|
||
**讲解与演示 (Teach & Demo): (6分钟)**
|
||
|
||
**师:** 我来给你们看一个东西。
|
||
【投屏展示教师提前准备好的测试结果页面,显示 ✅❌ 列表】
|
||
|
||
**师:** 在看之前,先讲一个重要规则——**生成测试脚本必须开新窗口。** 这和上节课需求审核的原因一样:AI 不会承认自己的问题。你在写游戏代码的同一个窗口里让 AI 生成测试,它会倾向于「测试通过」,因为它觉得自己写的代码没问题。换新窗口,让新的 AI 来测,它才会客观地发现问题。
|
||
|
||
**师:** 整个项目的窗口规则是这样的:写需求一个窗口、审核需求一个新窗口、生成代码一个新窗口、生成测试一个新窗口。**每个独立的任务,都在自己干净的窗口里做,避免上下文污染。**
|
||
|
||
**师:** 这是一个测试脚本跑出来的结果。你们来读一下——
|
||
- ✅ 消1行得分100分:通过
|
||
- ✅ 消2行得分300分:通过
|
||
- ✅ 消4行得分800分:通过
|
||
- ❌ 炸弹爆炸得分:期望50,实际得到0
|
||
- ✅ 游戏结束条件:通过
|
||
- ❌ 炸弹+消行叠加得分:期望150,实际得到100
|
||
|
||
**师:** 它自动测了6条规则,告诉我哪些通过了、哪些失败了,还说明了失败的具体原因——期望是多少,实际是多少。我没有玩游戏,是代码自己测自己。
|
||
|
||
**师:** 你们说,这个测试脚本是怎么工作的?它是怎么知道「消1行应该得100分」的?
|
||
**生:** (预期:从需求文档里知道的?)
|
||
**师:** 对!测试脚本的工作方式就三步:第一步,构造一个具体的场景——比如「棋盘最底行全满了一行」;第二步,调用游戏里的消行函数;第三步,对比结果和需求文档里写的数字。需求文档说100分,结果也是100分,就是 ✅;结果是别的数字,就是 ❌。
|
||
|
||
**师:** 你不需要看懂每一行代码。你只需要:能读 ✅❌ 结果、能看懂失败原因、能判断是代码问题还是需求文档问题。
|
||
|
||
**师:** 怎么判断失败原因?方法是这样的——
|
||
**师:** 如果 ❌ 显示「期望50,实际0」,你先查需求文档:文档里有没有写「炸弹爆炸得50分」?
|
||
**师:** 如果需求文档写了,但代码算出来是0,那是代码问题——让 AI 修代码。
|
||
**师:** 如果需求文档漏写了这条规则,那是需求问题——先补需求文档,再重新生成代码。
|
||
|
||
【投屏展示「生成测试脚本」提示词,见第5节】
|
||
|
||
**学生实践 (Practice): (15分钟)**
|
||
|
||
1. 把需求文档 + 游戏代码提交 Kimi,生成 `test.html`
|
||
2. 双击打开 `test.html`,查看测试结果
|
||
3. 对每一个 ❌,按以下步骤处理:
|
||
- 读失败原因:「期望 X,实际 Y」
|
||
- 查需求文档:这条规则文档里写清楚了吗?
|
||
- 如果是代码问题 → 告诉 Kimi「这个测试失败了:[失败信息],帮我修复」
|
||
- 如果是需求问题 → 先补充需求文档,再让 AI 重新生成代码
|
||
4. 修复后重新跑测试,目标:全部 ✅
|
||
|
||
> 教师走动观察重点:
|
||
> - 学生是否看到 ❌ 就直接让 AI「修代码」,而没有先判断是需求问题还是代码问题?
|
||
> - 是否有学生测试结果全是 ✅,但游戏实际上还有问题?此时引导:「哪条 bug 对应的规则,在需求文档里没有写到?」
|
||
> - 是否有学生 `test.html` 打开是空白?提示使用「测试失败溯源」提示词
|
||
|
||
**进度同步 (Checkpoint): (4分钟)**
|
||
|
||
**师:** 你的测试脚本发现了几个 ❌?哪一个让你最意外?
|
||
【诊断点:学生是否发现了手动测试时没有发现的问题】【应用层】
|
||
|
||
**【分支A】若测试发现了手动没发现的 bug:**
|
||
**师:** 这个 bug 你刚才手动玩的时候发现了吗?
|
||
**生:** 没有……
|
||
**师:** 这就是自动测试的价值——你没想到去测的地方,它帮你测了。想象一下,如果你发布了这个版本,别人玩到这个 bug 会怎么样?
|
||
**生:** 会觉得游戏有问题……
|
||
**师:** 但是因为你有测试脚本,你在发布之前就知道了。这就是「安全网」。
|
||
|
||
**【分支B】若测试全部通过:**
|
||
**师:** 全部通过——说明你的需求文档写得很清楚,AI 也执行得准确。但我再问一下:测试脚本测了几条?你的验收标准里有几条?
|
||
**生:** (如:测了5条,文档里写了7条……)
|
||
**师:** 有2条没有被测到。是不是那2条在生成测试脚本的时候,AI 没找到对应的逻辑?或者写得不够清楚,没办法生成测试?把那2条拎出来,让 AI 单独补测。
|
||
|
||
**【分支C】若测试脚本打不开或全是错误:**
|
||
**师:** 不要慌,这种情况很正常。我们用「最小化调试法」——不是让 AI 修整个测试脚本,而是只请它「单独测一条最简单的规则,比如消1行得100分」,先让一条测试跑起来,再逐步扩展。
|
||
|
||
---
|
||
|
||
**【分段四:有了安全网,放心魔改——第二版、第三版】(10分钟)**
|
||
|
||
*本段重点:建立「跑测试 → 确认安全 → 再改代码」的迭代习惯,鼓励学生大胆扩展*
|
||
|
||
**预设误概念:**
|
||
- 误概念:有了测试脚本,每次改完不用跑,「应该没问题」
|
||
- 误概念:第一版做到及格就行,没必要做第二版
|
||
|
||
**讲解与演示 (Teach & Demo): (3分钟)**
|
||
|
||
**师:** 你现在有了一个测试脚本。这个测试脚本是你的「安全网」。它的具体意义是什么?
|
||
|
||
**师:** 没有安全网的时候,你怕改出问题,所以不敢改太多。每次改完要自己手动测半天,万一改出新 bug 还得找半天。结果是——你不敢大胆加功能。
|
||
|
||
**师:** 有了安全网之后:每次改完代码,双击 `test.html`,10秒钟看结果。全部 ✅,说明原有功能没被破坏,可以继续加。出现 ❌,马上知道哪里出问题,立刻修。这就是「安全网」的具体作用——让你敢放心改代码。
|
||
|
||
**师:** 所以现在,有了安全网,我们才敢做更大胆的第二版。去做——比第一版更酷、更复杂。每加完一个功能,跑一遍测试,确认 ✅ 再继续加下一个。
|
||
|
||
**学生实践 (Practice): (5分钟)**
|
||
|
||
1. 在第一版基础上继续扩展——加第二个功能,或者把第一个功能做得更完整
|
||
2. 每次生成新代码后,跑 `test.html`,确认没有破坏原有逻辑
|
||
3. 有余力的学生继续做第三版,目标:做出功能灵感清单里「⭐⭐⭐」的功能
|
||
|
||
> 教师走动:鼓励学生跑测试,发现有学生只靠手动玩来验证时,提示:「跑一遍测试脚本,10秒就有答案,比手动玩快多了。」
|
||
|
||
**进度同步 (Checkpoint): (2分钟)**
|
||
|
||
**师:** 做了第二版的举手。你加了什么?跑测试了吗?结果怎样?
|
||
【诊断点:学生是否形成「加功能 → 跑测试 → 检查结果」的迭代习惯】【应用层】
|
||
|
||
**【分支A】若学生说「跑了测试,全部通过,然后继续加」:**
|
||
**师:** 这就是正确的迭代节奏。以后做任何项目都是这个节奏。
|
||
|
||
**【分支B】若学生说「加了功能但忘记跑测试」:**
|
||
**师:** 现在跑一遍。——有没有 ❌?
|
||
**生:** (跑完结果)
|
||
**师:** 如果有 ❌,这就是「不跑测试的代价」——你可能在不知情的情况下,新加的功能破坏了原来的逻辑。
|
||
|
||
---
|
||
|
||
**第三幕:反思 (Contemplate) — 10分钟** 🤔
|
||
|
||
*本幕目标:通过路演和互评,让学生反思「测试覆盖」的本质,以及「需求文档质量 = 测试质量」的核心认知*
|
||
|
||
**【环节】成果路演 (7分钟)**
|
||
|
||
**师:** 每人1.5分钟路演(6人小班)。路演有引导卡,大家拿一张。
|
||
【发放路演结构引导卡,见第5节】
|
||
|
||
**师:** 路演不是「打开游戏给大家看」——那只是演示,不是路演。路演要讲三件事:你加了什么功能、测试脚本发现了什么、你怎么修的。开始。
|
||
|
||
(每人依次路演,教师计时。路演要点:)
|
||
- 展示最终版本游戏(20秒演示)
|
||
- 展示测试脚本的 ✅❌ 结果(告诉大家发现了几个 ❌)
|
||
- 重点讲:最意外的那个 ❌ 是代码问题还是需求问题?怎么修的?
|
||
- 一句话总结:「如果重来一次,需求文档哪里会写得不一样?」
|
||
|
||
> 教师观察:是否有学生的路演只说了「我加了炸弹方块」,但没有说测试相关的内容?提示:「测试脚本发现了什么?」
|
||
|
||
**【环节】互评与讨论 (3分钟)**
|
||
|
||
**师:** 刚才大家的路演里,哪一个测试脚本发现的问题最有价值?
|
||
**生:** (讨论)
|
||
|
||
**师:** 我们来做一个结构化互评——选一位刚才路演的同学,给他的作品说「一个你觉得做得好的地方」和「一个你觉得可以改进的地方」。
|
||
**生:** (互评,例如:「他的炸弹功能很酷,但是我觉得爆炸范围可以更大一点」)
|
||
**师:** 「更大一点」——具体怎么大?你能告诉他怎么写到需求文档里吗?
|
||
**生:** (尝试表达:「爆炸范围从3×3改成5×5」)
|
||
**师:** 这就是一条可测试的需求改进建议。他可以把这条加到需求文档里,然后让 AI 重新生成。
|
||
|
||
**师:** 有没有人的测试结果全是 ✅,但路演时我们发现游戏还是有问题?
|
||
**生:** (可能有学生举手)
|
||
**师:** 这说明什么?
|
||
**生:** (预期:测试没有覆盖到那个情况……)
|
||
**师:** 对。测试只能发现「你写进需求文档的问题」。你没写的,它不知道要测。这就是为什么需求文档要尽量详细——需求文档越完整,测试覆盖越全,漏掉的 bug 越少。
|
||
|
||
**师:** 给今天的工作做一个评分——需求文档 100 分、测试脚本 100 分、游戏功能 100 分,你自己的三项各给多少分?
|
||
(让学生自评,不需要出声,心里有数就好)
|
||
|
||
**师:** 哪位愿意说说自己的分?
|
||
**生:** (分享,例如:「需求文档70,测试80,功能90」)
|
||
**师:** 三项里面,哪一项你觉得下次会做得更好?
|
||
**生:** (分享)
|
||
**师:** 记住这个答案。这就是你下一个项目要重点改进的地方。
|
||
|
||
---
|
||
|
||
**第四幕:延续 (Continue) — 5分钟** 🚀
|
||
|
||
**【环节】抽象总结 (3分钟)**
|
||
|
||
**师:** 两节课,我们走了一个完整的流程。谁来说说是哪几步?
|
||
**生:** Plan Mode → 需求文档 → 审核 → 生成 → 测试 → 修复……
|
||
|
||
**师:** 对。这个流程有个名字:需求 → 实现 → 测试 → 修复。真实的工程师每天都在走这个循环。
|
||
**师:** 今天最重要的一句话:**「测试通过才算完成,不是能玩就算完成。」**
|
||
**师:** 能玩是 60 分,测试通过是 90 分,需求文档里每一条都有测试覆盖是 100 分。
|
||
|
||
**师:** 还有一件事——今天你们体验了什么是「安全网」。这不只是测试脚本的概念,这是一种工作方式:在做危险操作之前,先建立一个保护机制。以后你们做任何项目,都可以问自己:「我有没有安全网?」
|
||
|
||
**师:** 最后,我想让你们想一个问题——今天学到的「需求文档 → 测试 → 修复」这个流程,除了做游戏,还能用在哪里?
|
||
**生:** (讨论:做网站?做 App?……)
|
||
**师:** 对。你们今天走的这个流程,和真实的工程师在公司里走的流程是一样的。只不过他们的项目更大、需求文档更长、测试脚本更复杂。但方法是一样的。
|
||
|
||
**【环节】下节预告 + 5分钟挑战 (2分钟)**
|
||
|
||
**师:** 接下来的课程,你们会做更大的项目。今天学到的——Plan Mode、需求审核、自动测试——会一直用到,只是项目变得更复杂。你们已经有了完整的工具箱。
|
||
|
||
**师:** 本周5分钟AI挑战:找到你需求文档里一条没有被测试覆盖到的规则,把它补进需求文档,然后让 Kimi 给测试脚本加上这条测试,跑一下看是 ✅ 还是 ❌。下节课说出你补的是哪条规则,测试结果是什么。
|
||
|
||
---
|
||
|
||
### 5. AI 助教使用指南
|
||
|
||
**⚠️ 新窗口使用规则(必须遵守):**
|
||
|
||
```
|
||
本课四个阶段的窗口规则:
|
||
|
||
窗口 A:写增量需求文档(整理新功能需求用这个窗口)
|
||
窗口 B:需求审核(全新窗口——AI 不会承认自己写的有问题)
|
||
窗口 C:执行生成(全新窗口——基于原代码增加新功能)
|
||
窗口 D:生成测试脚本(全新窗口——让新 AI 客观测试)
|
||
|
||
核心原则:审核、测试必须换新窗口。在同一个窗口里又写又审
|
||
又测,叫「上下文污染」——AI 会偏向为自己生成的内容辩护,
|
||
找不出真正的问题。
|
||
```
|
||
|
||
**增量需求文档模板(学生填写):**
|
||
|
||
```
|
||
# 新功能需求文档:[功能名称]
|
||
|
||
## 功能描述
|
||
[用一两句话说清楚这个功能是什么]
|
||
|
||
## 触发条件
|
||
[什么情况下这个功能会出现/触发?]
|
||
|
||
## 功能规则
|
||
[这个功能具体怎么运作?每条规则尽量具体]
|
||
|
||
## 与原有功能的交互规则
|
||
- 与消行的交互:[这个功能触发时,如果同时消了行,怎么处理?]
|
||
- 与得分的交互:[这个功能会影响得分吗?怎么影响?]
|
||
- 与游戏结束的交互:[游戏结束时,这个功能有没有特殊处理?]
|
||
|
||
## 验收标准(每条都要能自动测试)
|
||
1. [情况] → [预期结果]
|
||
2. [情况] → [预期结果]
|
||
3. [情况] → [预期结果]
|
||
```
|
||
|
||
**「增量生成」提示词:**
|
||
|
||
```
|
||
我已经有一个俄罗斯方块游戏(代码在下面)。
|
||
现在需要在这个基础上增加一个新功能,需求如下:
|
||
|
||
[粘贴增量需求文档]
|
||
|
||
要求:
|
||
1. 在已有代码基础上增加,不要改变原有功能的行为
|
||
2. 严格按照需求文档实现,不要添加文档里没有提到的内容
|
||
3. 核心逻辑函数(collides、clearLines、rotate 等)必须保持独立,
|
||
不要把逻辑和渲染混在一起(方便后续生成测试脚本)
|
||
4. 输出完整的 HTML 文件(内联 CSS 和 JS)
|
||
|
||
已有代码:
|
||
[粘贴游戏 HTML 代码]
|
||
```
|
||
|
||
**「生成测试脚本」提示词(本课核心):**
|
||
|
||
```
|
||
我有一个俄罗斯方块游戏,代码如下:
|
||
|
||
[粘贴游戏 HTML 代码]
|
||
|
||
我的需求文档如下:
|
||
|
||
[粘贴需求文档]
|
||
|
||
请帮我生成一个独立的 test.html 文件,要求:
|
||
1. 把游戏的核心逻辑函数(碰撞检测、消行、得分计算等)提取出来
|
||
2. 根据需求文档里的每一条规则,编写一个对应的测试
|
||
3. 每个测试构造一个具体的场景,调用函数,验证结果是否符合需求
|
||
4. 在页面上显示测试结果:✅ 通过 / ❌ 失败(失败时说明期望值和实际值)
|
||
5. 不需要任何外部依赖,双击 test.html 就能在浏览器里运行
|
||
|
||
重点测试的边界条件:
|
||
- 方块在左/右边界的碰撞
|
||
- 底部锁定
|
||
- 消1行/2行/4行的得分是否符合需求文档
|
||
- 消行后上方积木是否正确下移
|
||
- 游戏结束条件
|
||
- [新功能]的触发条件和结果
|
||
```
|
||
|
||
**测试脚本示例输出(教师用于课堂展示):**
|
||
|
||
```
|
||
俄罗斯方块测试结果
|
||
───────────────────────────────────
|
||
✅ 消1行得分 100 分 通过
|
||
✅ 消2行得分 300 分 通过
|
||
✅ 消4行(Tetris)得分 800 分 通过
|
||
✅ 游戏结束条件(积木超出顶行) 通过
|
||
❌ 炸弹方块落地得分 失败
|
||
期望:50 实际:0
|
||
→ 提示:clearBomb() 函数未返回得分
|
||
✅ 消行后积木正确下移 通过
|
||
❌ 炸弹 + 消行叠加得分 失败
|
||
期望:150(50+100) 实际:100
|
||
→ 提示:爆炸触发消行时,炸弹得分未累加
|
||
───────────────────────────────────
|
||
6/8 通过 2/8 失败
|
||
```
|
||
|
||
**「测试失败溯源」提示词:**
|
||
|
||
```
|
||
我的测试脚本显示这个测试失败了:
|
||
测试名称:[测试名称]
|
||
期望结果:[期望值]
|
||
实际结果:[实际值]
|
||
|
||
我的需求文档里关于这条规则写的是:
|
||
[粘贴相关需求]
|
||
|
||
请帮我分析:
|
||
1. 是代码实现有问题?还是需求文档没有说清楚?
|
||
2. 如果是代码问题,具体是哪里需要修改?
|
||
3. 如果是需求问题,我需要在需求文档里补充什么?
|
||
```
|
||
|
||
**测试失败溯源示例对话:**
|
||
|
||
```
|
||
学生输入:
|
||
测试名称:炸弹方块落地得分
|
||
期望结果:50
|
||
实际结果:0
|
||
需求文档写的是:炸弹方块落地时,播放爆炸动画,得分+50
|
||
|
||
AI 回答:
|
||
这是代码问题。你的需求文档写得很清楚——「落地得分+50」。
|
||
问题出在 clearBomb() 函数:当前函数只处理了爆炸效果,
|
||
没有调用得分更新逻辑。建议修改:
|
||
在 clearBomb() 函数末尾加一行 score += 50 并调用 updateScore()。
|
||
```
|
||
|
||
**功能灵感参考清单:**
|
||
|
||
| 功能 | 复杂度 | 一句话说明 |
|
||
|------|--------|---------|
|
||
| 炸弹方块 | ⭐⭐ | 落地后炸掉周围3×3范围 |
|
||
| 速度加成方块 | ⭐⭐ | 碰到就让下落速度加快5秒 |
|
||
| 冻结方块 | ⭐⭐ | 碰到就让当前方块暂停3秒 |
|
||
| 彩虹消行 | ⭐ | 消行时屏幕闪彩虹色 |
|
||
| 方块预言家 | ⭐⭐ | 显示接下来3个方块 |
|
||
| Boss 行 | ⭐⭐⭐ | 每隔10行出现一行无法普通消除的行 |
|
||
| 重力反转 | ⭐⭐⭐ | 消4行触发5秒方块往上飞 |
|
||
|
||
**路演结构引导卡(路演前发给学生):**
|
||
|
||
```
|
||
我的路演(每人约1.5分钟)
|
||
|
||
1. 我做了几个版本,加了什么功能(20秒)
|
||
→ 演示给大家看
|
||
|
||
2. 需求文档改了几版(20秒)
|
||
→ AI 审核问了我什么让我意外的问题?
|
||
|
||
3. 测试脚本发现了什么(30秒)
|
||
→ 发现了几个 ❌?
|
||
→ 最意外的 ❌ 是什么?是代码问题还是需求问题?怎么修的?
|
||
|
||
4. 如果重来一次(10秒)
|
||
→ 需求文档哪里会写得不一样?
|
||
```
|
||
|
||
---
|
||
|
||
### 6. 教师指南
|
||
|
||
**本课技术备注:**
|
||
|
||
测试脚本的原理:游戏的核心逻辑函数(`collides`、`clearLines`、`rotate`)是纯函数——给定输入,返回确定的输出,不依赖渲染。测试脚本把这些函数复制出来,构造特定的棋盘状态作为输入,调用函数,然后检查输出是否符合需求文档的描述。整个过程在浏览器里运行,不需要任何安装。
|
||
|
||
需求文档与测试的关系:测试脚本的质量取决于需求文档的质量。需求文档里写「消行得分」但没写具体数字,AI 就无法生成有意义的测试。这是本课的核心教学点——需求越具体,测试越有效。
|
||
|
||
增量需求文档的代码实现原理:教师需要了解,增量功能是在已有代码的基础上「插入」新逻辑,而非替换。Kimi 在生成增量代码时会查找合适的插入位置(比如 `clearLines()` 函数内部)并添加新逻辑。如果原有代码结构混乱(逻辑和渲染混在一起),AI 会很难找到插入点,导致生成失败。这就是为什么第6课的「增量生成」提示词里要求「核心逻辑函数保持独立」。
|
||
|
||
**常见问题 FAQ:**
|
||
|
||
| 问题 | 应对 |
|
||
|------|------|
|
||
| 「测试脚本打开是空白页」 | 检查 HTML 文件是否完整;让 Kimi 检查生成的代码有没有语法错误 |
|
||
| 「测试全部 ❌」 | 很可能是函数提取时出了问题;让 Kimi「只提取 clearLines 函数写一个最简单的测试」,逐步调试 |
|
||
| 「测试全部 ✅ 但游戏还是有 bug」 | 引导学生找到:哪条 bug 对应的规则,在需求文档里没有写到?这就是测试覆盖不足 |
|
||
| 「Kimi 生成的测试脚本太复杂看不懂」 | 「你不需要看懂每一行代码,只需要看 ✅❌ 结果和失败原因」;理解结果比理解实现更重要 |
|
||
| 「测试失败但不知道是代码问题还是需求问题」 | 使用「测试失败溯源」提示词,让 AI 帮你判断 |
|
||
| 「AI 审核问了太多问题,不知道怎么回答」 | 让学生先回答最好回答的那一条,其他的暂时写「待定」,先生成第一版,跑测试的时候再补 |
|
||
| 「增量生成后原有消行功能不见了」 | 说明 Kimi 误修改了原有逻辑;把原版代码重新提交,强调「不要改变原有功能的行为」 |
|
||
| 「验收标准不知道怎么写」 | 用「情况 → 预期结果」句式套一遍:「[什么情况] → [应该看到什么]」;如果写不出来,说明还没想清楚这条规则 |
|
||
| 「第二版加完功能跑测试有 ❌,但不知道是新功能的问题还是旧功能出了问题」 | 先把新功能注释掉,跑测试,确认旧功能全部 ✅;再把新功能打开,重新跑,锁定是新代码引入的问题 |
|
||
| 「路演超时怎么办」 | 路演前说清楚:演示只需要展示「最酷的那一个功能」,不需要演示全部;测试部分只说「最意外的 ❌」 |
|
||
|
||
**课堂节奏控制:**
|
||
|
||
- 分段一(15分钟):最容易超时的环节是「AI 审核」——有学生会和 AI 进行很长的对话。给学生一个限制:AI 审核最多回答3轮问题,然后就进入执行。
|
||
- 分段二结束时,学生手动测完后,教师主动提问「你需求文档里有几条规则,你测了几条」——制造认知冲突,让学生自己感受手动测试的不完整性,再引出自动测试。
|
||
- 分段三的核心是「看懂 ✅❌ 结果并溯源」,不是「让每个学生都把测试写完」。进度慢的学生只要跑出测试结果、理解一个 ❌ 的原因即可。
|
||
- 分段四时间有限,对于进度慢的学生,「跑一遍测试确认第一版没问题」就算达标,不强求做第二版。
|
||
- 路演时间(第三幕)要严格控制在1.5分钟/人。如果有学生的功能特别复杂,教师可以帮助提炼:「你只需要说最意外的那个 ❌,其他的可以跳过。」
|
||
|
||
**课堂风险预案:**
|
||
- 如果 Kimi 生成的测试脚本无法运行:教师用提前准备好的演示版本讲解概念,让学生理解「测试脚本是什么、能发现什么问题」即可,不强求每人都跑成功。
|
||
- 如果学生进度差异大:进度快的学生尝试「给测试脚本加更多边界条件测试」;进度慢的学生重点完成「生成第一版 + 跑一次测试 + 理解结果」。
|
||
- 如果网络不稳定导致 Kimi 响应慢:提前在教师电脑上缓存一份完整的增量生成 + 测试脚本生成示例,用于离线演示。
|
||
|
||
---
|
||
|
||
### 7. 5分钟日常AI挑战
|
||
|
||
**本周挑战:** 给你的游戏补一条没有被测试覆盖的规则
|
||
**挑战说明:** 找到你需求文档里一条没有被测试脚本覆盖到的规则,把它补进需求文档,然后让 Kimi 给测试脚本加上这条测试,跑一下看是 ✅ 还是 ❌。
|
||
**下节课分享:** 说出你补的是哪条规则,测试结果是什么
|
||
|
||
---
|
||
|
||
### 8. 拓展任务
|
||
|
||
**拓展一(推荐):** 让你的测试脚本覆盖所有需求文档里的规则——对照需求文档逐条检查,补上缺少的测试。目标:测试脚本的条数 = 验收标准的条数。
|
||
|
||
**拓展二(挑战):** 在需求文档里加一个你自己想出来的「边界情况」,写清楚预期结果,让 AI 生成对应的测试,看游戏能不能通过。参考方向:「同时消4行 + 炸弹爆炸」这种极端叠加情况的得分是多少?
|
||
|
||
**拓展三(超级挑战):** 试着把你的增量需求文档写得让另一个同学能看懂——交换给同桌,让他/她用你的需求文档,在他/她的游戏上生成同样的功能。看看你的需求文档清不清楚。
|