WEEK 08
把測試做紮實:更貼近業界的測試方式 TESTS.md
上週的 VERIFY.md 是驗收:你寫、條數少、人看得懂。這週把測試做紮實:TESTS.md 由 AI 從每一條 VERIFY 展開成細部測試,邊界、沒想到的情況、組合、順序、迴歸,每一條都說得出它從哪一條來;你用三個問題審它。可是測試全部通過,就代表測得好嗎?故意把程式弄壞一行,看測試抓不抓得到:沒抓到的那一次,就是少的那條測試。最後,人和 AI 都有盲點:照著使用者故事親自玩一遍,才找得到沒想到的問題。
影片 01VERIFY 就夠了嗎?TESTS.md
VERIFY 是驗收,TESTS 是細部測試。VERIFY.md 由你寫,條數少、人看得懂,說「怎樣算做好」(驗收測試,Acceptance Test);TESTS.md 由 AI 從每一條展開成細部測試(Test Cases)。上週 AI 補的先寫在 VERIFY 裡,是簡化版;實務上更常會多一份 TESTS.md 來管理,你寫的和 AI 補的分清楚。
一條 VERIFY,展開成好幾條。邊界:剛好在線的兩邊各測一次(1 格內撿得到、2 格撿不到);沒想到的情況:那一格已經 64 個;組合:兩個一起撿,數字 +2;順序:撿起來、重新整理網頁,數字還在;迴歸:修好過的 bug 寫成一條測試,以後不能再發生。
每一條都追得回來(追溯,Traceability)。T3.1 就是 STEP 3 展開的第 1 條。審的時候一組一組看;VERIFY 改了,馬上知道哪幾條要跟著改。
AI 展開,你審三個問題。請 Codex 從 VERIFY.md 寫成 TESTS.md,每條標出來源,先不要寫程式;再問:每一條 VERIFY 底下都有細部測試嗎?有沒有邊界情況?測的是規則,不是畫面?(「很好看」測不出來。)不對就請 AI 改。
順序:VERIFY → TESTS → PLANS。先展開成細部測試,再排進 PLANS 的每一步。AGENTS.md 寫上:VERIFY.md 不要改;TESTS.md 從 VERIFY 展開,每條標出它來自哪一條;TESTS.md 我審過,才開始寫程式。
影片 02突變測試(Mutation Testing)
全部通過,只代表通過了「寫出來的那些」測試。程式和測試都是 AI 寫的;測試寫得太鬆,程式錯了也照樣綠燈。沒寫到的地方,綠燈不會告訴你。
故意弄壞一行,看測試抓不抓得到。像消防演習:把程式的一個數字改壞,跑全部測試。有測試變紅=抓到了,這些測試有用;全部還是綠的=沒抓到,少了一條測試。這叫突變測試(Mutation Testing)。
沒抓到的那一次,就是少的那條測試。把撿得到的距離 1.5 改成 15,測試全部通過,島上卻站在 5 格外也撿得起來:原來 T3.1 只測了「1 格內撿得到」。補上「2 格撿不到」,再弄壞一次,這次抓到了。
交給 Codex 做。先 commit;請它一次只改一行、跑全部測試、記下有沒有失敗、再改回來,最後告訴你哪一次沒被抓到。沒抓到的(放方塊時不扣數量),請它補一條測試並確認抓得到;全部改回來、全部通過,才 commit。
三個規則。先 commit,弄壞了才回得去;一次只改一行,試完一定改回來;沒抓到,要補的是測試,不是程式。不用每一行都試,先試最重要的規則(數字、存檔)。
影片 03透過 User Story 幫助實測
大家都有盲點。測試全部通過,親自玩卻發現:走到島的邊邊掉下去,就一直掉、回不來。測試只會檢查「想得到的」;你沒想到,AI 也沒想到。
親自玩,才會發現。會發現兩種問題:壞掉的(bug),和不好玩的(太慢、看不懂要按什麼)。測試判斷不了好不好玩,所以交出去之前的最後一步,是人親自測試(Manual Testing)。
使用者故事(User Story):身為__,我想要__,這樣__。從玩家的角度,寫下他想完成的一件事。它通常在前期討論需求時寫,所以常和
BRIEF.md放在一起;也有開發者直接開一份USER_STORIES.md。照著故事的路徑玩,記在
playtest.md。一張故事就是一條要親自走一遍的路:記下怎麼走、✓ 還是 ✗、發生了什麼。發現的問題接回流程:你先寫進 VERIFY → AI 展開進 TESTS → 先紅、再綠修好 → 弄壞一行確認抓得到 → 再親自走一次那條路。先小、再大。先挑 3~5 條最重要的故事,親自走一遍;都沒問題,再擴展到更多故事、更多自動測試;最後找別人來玩,他們會走你沒想到的路。
補充 1分支與 Pull Request:三個人一起改同一個專案
三個人都直接改 main,會互相蓋掉。同時推上去,後推的可能把前面的蓋掉;有人推了一個壞掉的版本,大家拿到的 main 都不能玩了。
分支(Branch):從 main 拉一條自己的繩子。一個功能一條,名字說清楚(
add-rain);你的修改都夾在自己這條上,main 完全沒動,永遠能玩。開 branch、commit、推上 GitHub,都可以交給 Codex:跟它說清楚 branch 叫什麼、要做什麼。它做完會告訴你做了哪些事,你要看得懂:開了add-rain,也推上 GitHub 了。Pull Request(PR):請組員看過,再接回 main。像在繩子上掛一張「請幫我看看」:組員一張一張看,沒問題才接回 main。在 GitHub 上就是四步:掛上「請幫我看看」= Compare & pull request(開一個 PR,寫清楚做了什麼、怎麼測的,Reviewers 選組員);一張一張看 = Files changed(紅色是刪掉的,綠色是加上的);看過沒問題 = Approve;接回 main = Merge。現在都用 AI 開發,組員可以先請 Codex 幫忙看一遍(改了什麼、測試過了沒、會不會和別人衝突),自己再看重點;最後按 Approve 的還是人。
衝突(Conflict):兩個人改到同一行。Git 不知道要留哪一個,所以這時候不能接回 main,Merge 按鈕是灰的。GitHub 會標出是哪幾行:
<<<<<<<到=======是這條 branch 的,=======到>>>>>>>是 main 現在的;要留哪一個(或兩個都要)由人決定。可以請 Codex 幫忙解,但要說清楚兩邊都要什麼。先在自己的 branch 上解好、跑測試、自己玩一遍,再請組員看一次,才合併回 main。衝突很正常,不用怕。一起開發的五個習慣。main 永遠要能玩,不要直接在 main 上改;一個功能一條 branch,名字說清楚;發 PR:先請 Codex 看一遍,組員再看過才合併;合併前測試全綠、自己玩過;合併完先拿最新的 main,再開下一條。影片裡的 GitHub 畫面,是在示範用的 private repo 實際操作截下來的;Codex 畫面是示意。
補充 2把 bug 寫清楚:GitHub Issue
只說「壞了」,別人很難修。就像看醫生:只說「我不舒服」,醫生很難幫你;說清楚哪裡、什麼時候、怎麼不舒服,醫生才知道從哪裡開始查。bug 回報也一樣,寫得越清楚,越快修好。
好的回報寫五件事。標題:一句話說清楚是什麼問題;在哪裡:哪一關、哪個畫面;重現步驟(Steps to Reproduce):一步一行,別人照著做也會發生;應該/實際(Expected/Actual):兩句放在一起,一看就知道差在哪;截圖和裝置:有些 bug 只在某些電腦或瀏覽器上才會發生。寫完,自己照著步驟再做一次,確定真的會發生才送出去。
寫進 GitHub 的 Issues。按 New issue,照五件事寫,截圖直接拖進框裡;加上標籤 bug,按 Create。一個 bug 一張單、一個編號(例如 #12),大家都看得到,修好了再關掉。
修好,Issue 自動關掉。要修的時候,把 Issue 的內容貼給 Codex:照重現步驟先寫一個會失敗的測試,確認失敗再修好(就是影片 01 的 T3.5:迴歸)。PR 的說明寫「Fixes #12」,合併以後 Issue #12 會自動關掉;從回報到修好,每一步都找得到。
寫回報的好習慣。一個 Issue 只寫一個 bug;標題一句話;寫重現步驟、應該/實際,附上截圖;送出前自己照著步驟再做一次。收到不清楚的回報,也可以請對方照這五件事補。影片裡的 GitHub 和 Codex 畫面是示意。
練習 1進入遠端電腦
這不是影片,而是一台在瀏覽器裡開啟的「遠端電腦」,和前幾週是同一台,換成這週的任務,有 Mac 和 Windows 兩種,選你平常用的那一種。這週練的是把測試做紮實:請 AI 從 VERIFY.md 展開 TESTS.md,你用三個問題審;故意弄壞一行,看測試抓不抓得到;照使用者故事親自玩,記在 playtest.md,發現的問題再接回流程。任務 5–7 是補充 1、2:三個人一起做,練分支、Pull Request、衝突和 GitHub Issue。要寫的字都可以複製貼上,目的是把流程練到手很熟;上週練過的動作標「自己來」,不再指位置。專案接著上週你自己的「空中之島」。連線後先選一個任務,照著任務卡做;要離開時,按畫面上方中間的「中斷連線」。每次進入都是一台全新的電腦;重新整理或離開後,這次的進度不會留下。
練習環境的畫面是繁體中文;需要用滑鼠和鍵盤操作,建議用電腦的瀏覽器開啟,手機的螢幕太小。
把測試做紮實。把規則寫進
AGENTS.md,請 Codex 從VERIFY.md展開TESTS.md,每條標出來源;你用三個問題審:每一條 VERIFY 都展開了嗎?有沒有邊界?測的是規則,不是畫面?不對就請它改,你審過才請它寫成自動測試。故意弄壞一行。先
git status確定都 commit 了,再請 Codex 做突變測試:一次只改壞一行、跑全部測試、改回來。「放方塊時不扣數量」那一次沒被抓到:少的是一條測試,不是程式。請它補上,再弄壞一次確認抓得到,自己跑npm test再 commit。照使用者故事親自玩,問題接回流程。把三條使用者故事貼進
BRIEF.md,用touch(Windows 是New-Item)建playtest.md,照著故事玩、記下 ✓ 或 ✗。走到島的邊邊掉下去就回不來:先寫進VERIFY.md,再請 Codex 展開進 TESTS、寫成測試、修好;弄壞一行確認抓得到,親自再走一次,最後git push。練習裡的 Codex 不會真的寫程式,真正的作業請在你自己的電腦上做。卡住時按任務卡上的「提示」。一起開發:分支、PR、Issue(補充 1、2)。請 Codex 開 branch、做好、推上 GitHub,用
git branch看懂它做了什麼;在 GitHub 按 Compare & pull request,Reviewers 選組員,組員 Approve 以後才 Merge;合併完git switch main、git pull。組員先合併了改到同一行的 PR,你的 PR 就會衝突:按 Resolve conflicts 看是哪一行,說清楚兩邊都要什麼,請 Codex 在你的 branch 上解。組員說「你的遊戲壞了」:自己先重現一次,照五件事寫成 Issue,PR 說明寫 Fixes #編號,合併以後 Issue 自動關掉。

