iT邦幫忙

2026 iThome 鐵人賽

DAY 11
0
Vibe Coding

一個 Vibe Coding 專案從原型到有人在用系列 第 11 篇

AI 說 1468 個測試全過,推上去半分鐘就紅了

  • 分享至 

  • xImage
  •  

你叫 AI 改一段程式,交代一句:改完跑測試,要全過。它回報:1468 個測試全過。

你推上 GitHub。不到半分鐘,那顆燈紅了。

昨天講的是推上去之後:GitHub 上的檢查亮了紅燈,要有人去點開看。今天往前一步,看推上去之前。AI 回報的「全過」,是照哪張清單驗的?

8 月 9 日深夜,工作單只寫了一行驗收

usage 是我做的開源小工具,顯示 Claude Code、Codex 這幾家 AI 工具的額度。它讀的是這些工具存在你電腦上的使用紀錄。

那天晚上要補一個小缺口。Codex 的紀錄預設放在家目錄的 .codex 資料夾,使用者可以用 CODEX_HOME 這個設定把它搬到別處。usage 只會去預設的地方找,搬走了就讀不到。

這件事交給 Codex 做。工作單(交給 AI 的任務說明)的最後一段叫「完成後」,只寫了一行:

跑 pytest 全部通過,並列出最終改了哪些檔案

pytest 是跑測試的工具。Codex 改了 11 個檔案,回報裡寫著:

最終驗證:1468 passed, 2 skipped

1468 個通過,2 個跳過。我叫 Claude 把改動存進版本紀錄,推上 GitHub。

推上去半分鐘,CI 報了 12 個錯

CI 是每次推上 GitHub 就自動跑的一輪檢查,Day 10 介紹過。usage 的 CI 第一項是格式檢查,用的工具叫 ruff。它不管程式算得對不對,只管寫法有沒有照專案定的規矩。

紅的就是這一項。寫這篇時,我把那個版本拿出來,在自己電腦上跑一次 ruff,結果一樣:

$ ruff check . --statistics
9	SIM300	[*] yoda-conditions
3	I001  	[*] unsorted-imports
Found 12 errors.
[*] 12 fixable with the `--fix` option.

左邊的數字是幾個錯,中間是規則代號,[*] 表示這條能自動修。9 個是比較式兩邊的順序不合規矩;3 個是 import(程式開頭把別的程式載進來的那幾行)排的順序不對。12 個都出在這次改到的檔案,都能自動修。

這些是寫法問題,不是程式算錯。推上去之前在本機跑一次 ruff 就抓得到,可是工作單的驗收沒要求這一項,回報裡也沒提。

這顆燈後來紅了一個多小時。

CI 查五項,驗收只寫了一項

usage 的 CI 分兩組,一組在 Mac 上跑,一組在 Windows 上跑。打開 CI 的設定檔,Mac 那組每次跑這五項:

- name: Run ruff
- name: Run mypy
- name: Run bilingual doc parity check
- name: Run file size ceiling check
- name: Run pytest

白話是:格式檢查、型別檢查(每個變數裝的資料種類有沒有對上)、中英文件有沒有對齊、單一檔案有沒有超過行數上限、跑全部測試。

工作單寫的 pytest,是第五項。回報的 1468 passed,也是第五項。這一項的數字對得上:我數過那個版本,測試一共 1470 個,扣掉 2 個跳過,正好 1468。

前面四項,驗收沒寫,回報也沒提。推上去紅的,就是其中第一項。

寫了四項的那張,還是漏了一項

同一個專案,8 月 6 日也有一張工作單,要把一個太長的檔案拆小。那張的驗收列了四條指令:

.venv/bin/ruff check .
.venv/bin/mypy .
.venv/bin/python -m pytest -q
.venv/bin/python scripts/check_file_size.py

.venv 是專案自己的 Python 環境。四條依序是格式、型別、測試、檔案行數,比 8 月 9 日那張完整得多。可是拿去對 CI,它也少一項:中英文件對照。CI 每次推上去五項都跑,不管這次改的是什麼。

兩張工作單,清單都是手寫的。手寫的清單,每張都要重寫一次,每次都可能漏。

https://ithelp.ithome.com.tw/upload/images/20260925/20183178p5M63swLzv.png

讓 CI 的設定檔當清單

清單不用自己寫。CI 要查什麼,設定檔裡早就寫好了,放在專案的 .github/workflows/ 資料夾。叫 AI 照它跑就好:

打開 .github/workflows/ 裡每次推上去都會跑的設定檔(可能不只一個),
把裡面每一個檢查步驟,在本機用同樣的指令跑一遍,
每一項貼出最後一行結果。本機跑不了的,列出來,標「本機跑不了」。

補上 12 個修正之後的那個版本,我照這段做了一次。整理成一項一行:

ruff:All checks passed!
mypy:Success: no issues found in 183 source files
中英文件對照:PASS: bilingual document parity check passed
檔案行數:menubar.py: 1242/1242 lines (ok)
pytest:1468 passed, 2 skipped in 20.28s
Windows 那組:本機跑不了

CI 的每一項都要有一行。少一行,就是那項沒跑。

指令最後那句不能省。usage 的 CI 還有 Windows 那組,我的 Mac 跑不了。

本機跑得到的,推上去之前擋下。本機跑不了的,推上去之後照 Day 10 那條:叫 AI 把這個版本在 GitHub 上跑過的每一項檢查列出來,名字、在哪個系統跑、結果,有紅的就貼錯誤訊息。兩條規矩守的是不同的地方,都要留著。

https://ithelp.ithome.com.tw/upload/images/20260925/20183178G2HKs6cOzW.png

你的專案,CI 查幾項

現在就可以做一件事:打開你專案的 .github/workflows/ 資料夾。

沒有這個資料夾,GitHub 上就沒有替你跑的檢查。AI 說的「全過」,就只有它自己在你電腦上跑的那些,推上去之後也沒有第二道檢查。

有的話,數一數裡面有幾個檢查步驟(安裝環境、下載程式碼那種不算)。再翻出你最近一次叫 AI 驗收時寫的那句話,看看寫了幾項。兩個數字對不上,下面這行就是補法。

今天可以帶走的

工作單裡有一格「做完怎麼算對」,Day 4、Day 8、Day 9、Day 10 各在這格加了幾行。今天再加一行:

做完怎麼算對:
- (Day 4、Day 8、Day 9、Day 10 加的幾行)
- 推上去之前:打開 CI 設定檔,每一項檢查在本機用同樣的指令跑一遍,每項貼最後一行結果;本機跑不了的列出來,推上去之後列出這個版本在 GitHub 上的每一項檢查和結果

今天講的是清單要照 CI 列。明天看另一種漏法:清單寫了,回報也貼了最後一行,還是漏了。8 月 6 日那張工作單寫明,測試至少要 1468 個通過。回報只有一行,同一行裡寫著「失敗」,也寫著「完成」,測試的數字是 99。那次的改動,照樣推上去了。

參考資料

  • usage 專案:https://github.com/aqua5230/usage
  • 推上去半分鐘就紅的那次 CI:https://github.com/aqua5230/usage/actions/runs/31323333072
  • 12 個錯一次補完的修正:https://github.com/aqua5230/usage/commit/7a8f8f60f926e3b43c1488f61453545019fe1b7f
  • ruff 規則 SIM300(比較式兩邊的順序):https://docs.astral.sh/ruff/rules/yoda-conditions/
  • ruff 規則 I001(import 排序):https://docs.astral.sh/ruff/rules/unsorted-imports/
  • GitHub Actions 的設定檔怎麼寫:https://docs.github.com/en/actions/concepts/workflows-and-actions/workflows

上一篇
Windows 版一打開就跳錯,有一顆燈早就紅了快 9 小時
下一篇
AI 回報 99 個測試通過,工作單要的是 1468 個
系列文
一個 Vibe Coding 專案從原型到有人在用 共 18 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言