生活分享

CLI 寫程式:理解、規劃、修改與測試

用 Gemini CLI 寫程式,可靠的流程是先理解專案與重現問題,再規劃小範圍修改、檢查差異並執行相關測試。本篇用一個簡單的活動人數函式示範完整工作順序。你不需要一開始就交出整個應用程式,也能學會如何給資料、判斷修改是否對題,以及儲存驗證結果。

更新日期: 閱讀時間約 4 分鐘

寫程式的驗收循環的原創插畫,以文件、裝置與流程等物件呼應理解、規劃、修改與測試;非產品介面。
圖片:Mokaair (© Mokaair)
本篇目錄
  1. 開始前:建立可恢復的練習專案
  2. 理解問題:先請它讀,不急著改
  3. 實作:規劃、修改與測試
  4. 預期結果:測試通過也要看差異
  5. 從練習移到真正專案
  6. 常見問題與交付方式
  7. 完成後的檢核

用 Gemini CLI 寫程式,可靠的流程是先理解專案與重現問題,再規劃小範圍修改、檢查差異並執行相關測試。本篇用一個簡單的活動人數函式示範完整工作順序。你不需要一開始就交出整個應用程式,也能學會如何給資料、判斷修改是否對題,以及儲存驗證結果。

重現問題:先讓原始測試失敗;修改程式:檢視實際變更;相同測試:確認修正後通過
寫程式的驗收循環。此為原創教學圖解,並非產品畫面或實測輸出。 · 圖片:Mokaair (© Mokaair)

開始前:建立可恢復的練習專案

完成與,準備 Node.js 和獨立資料夾。本篇以 CLI 0.59.0 為基準,範例函式與測試可在本機直接執行;模型實際修改的品質,需依你的執行結果核對。若使用既有 Git 專案,先檢視工作目錄差異,不要覆蓋原本未提交的內容。

先讀專案已有的 README、套件腳本與。你要讓 CLI 知道工作範圍、不能改的部分及完成條件,而不是直接要求「把專案變好」。如果只是修一個計算錯誤,就不應順便更換框架、重排整個目錄或改動無關頁面。

本次需求是「將成人與兒童人數相加,並拒絕負數或非整數」。先把輸入與預期結果寫清楚:兩位成人加一位兒童應為三;負一位成人不合理;小數人數也應拒絕。這些案例來自需求,並非等程式寫完後才照著實作抄一份測試。

理解問題:先請它讀,不急著改

在專案建立 people.mjs 與 people.test.mjs,使用下面有缺陷的函式與需求測試。先在終端機執行測試,確認它真的失敗,再請 CLI 說明原因。若測試根本沒有啟動,應先修正執行方式,而不是立刻修改函式。

people.mjs:待修正範例 · javascript
export function totalPeople(adults, children) {
  return adults + children + 1;
}
people.test.mjs · javascript
import test from "node:test";
import assert from "node:assert/strict";
import { totalPeople } from "./people.mjs";

test("加總成人與兒童", () => assert.equal(totalPeople(2, 1), 3));
test("拒絕負數", () => assert.throws(() => totalPeople(-1, 1)));
test("拒絕小數", () => assert.throws(() => totalPeople(1.5, 1)));

實作:規劃、修改與測試

  1. 執行 node --test people.test.mjs,儲存原始失敗結果。
  2. 啟動 Gemini CLI,引用兩個檔案,要求先解釋失敗原因與最小修改計畫。
  3. 核對計畫是否只處理加總與輸入驗證,再讓 CLI 進行修改。
  4. 檢視檔案差異,確認沒有改動測試預期值來配合錯誤程式。
  5. 重跑同一組測試,最後手動檢查空值、字串等額外輸入是否需列入正式需求。
Gemini CLI 內輸入 · text
@people.mjs @people.test.mjs
請先說明測試失敗原因,提出只修改 people.mjs 的最小計畫。
需求:成人與兒童都必須是非負整數,回傳兩者相加。
不要修改測試預期值,不新增外部套件。

可使用 /plan 進入規劃模式,或啟動時指定 --approval-mode plan;操作前先確認當前版本與功能開關。規劃模式的目的,是先把方法與影響說清楚,不是保證所有讀取與工具行為完全相同。權限細節請搭配核對。

預期結果:測試通過也要看差異

合理修正應先驗證兩個輸入都是非負整數,再回傳相加結果。下面是人工整理的參考解答,方便你核對邏輯,並非宣稱某次模型必然產生完全相同的程式。錯誤訊息可以不同,但有效輸入與拒絕條件必須符合需求。

people.mjs:參考解答 · javascript
export function totalPeople(adults, children) {
  if (![adults, children].every((value) => Number.isInteger(value) && value >= 0)) {
    throw new TypeError("人數必須是非負整數");
  }
  return adults + children;
}
終端機命令 · bash
node --test people.test.mjs
git diff -- people.mjs people.test.mjs

第二行只適用於 Git 專案,尚未使用 Git 時可用編輯器比較檔案。預期三個測試通過,差異只包含需要的函式修正。若 CLI 修改了測試、刪掉輸入檢查或加入不必要套件,即使某次測試變綠,也要重新檢查是否違反原始需求。

從練習移到真正專案

真正專案通常有多層測試與型別檢查。先跑與修改直接相關的檢查,透過後再依專案規範完成必要驗證。不要把「編譯通過」當成「使用者流程正常」,也不要在沒有瀏覽器驗證時宣稱畫面已完成。交付時寫清楚改了什麼、怎麼測、還有哪些限制。

提交前再看一次變更檔案清單,確認沒有把下載資料、個人設定或測試產物混入。若測試需要外部服務而無法執行,記錄缺少的環境與尚未驗證的行為,讓接手者知道要補哪一項證據。

需要編輯器整合時,先檢視 /ide 與官方整合檔案,確認實際連線狀態;設定檔存在不代表編輯器已連上。/setup-github 會開始 GitHub Actions 設定流程,與單純本機測試不同,只有在你要建立該工作流程並理解專案權限時才使用。

若任務變大,先把唯讀調查與具體修改拆開,再考慮。多個代理不應同時修改同一批檔案;整合者仍要核對差異與測試證據。重複的工作方法可整理成,但每次需求與驗收標準仍要明確提供。

常見問題與交付方式

「模型說測試通過,但我看不到結果」要求列出實際執行命令、退出狀態與重點輸出。沒有工具結果時,只能算建議或預期,不算已驗證。你也可以在自己的終端機重跑相同命令交叉確認。

「一次改太多怎麼辦」先停止擴大範圍,檢視差異,把修改拆成對應需求的小部分。保留原本未提交的內容,再決定撤回或重做哪些檔案;不要用一條全域重設命令清掉整個工作目錄。

「測試一直失敗要讓它反覆修嗎」先判斷是環境、既有錯誤還是本次修改造成。保留第一個可重現失敗,讓修正有明確目標;如果需要換方向,先更新計畫。完成後用儲存成果,讓下一次工作能從已核對的狀態繼續。

完成後的檢核

完成實作後逐項確認。
檢查項目通過條件
操作能依正文重做一次,說明每一步使用的輸入。
結果能用原始資料或可重現測試核對輸出,而非只看語氣。
延伸知道下一篇教學解決的問題,以及什麼時候需要它。

接著可以閱讀 、,把本篇的操作接到下一個工作流程。

  • 生活分享

    完整實作:文件摘要與資料擷取工具

    這篇把前面學過的提示詞、API 呼叫與 JSON 驗證串成一個可執行的檔案工具。輸入一份 UTF-8 活動公告,程式產生摘要、五個固定欄位、原文引用與待確認問題,再存成待審 JSON。你會練習把模型當作資料處理的一個步驟,讓驗證與儲存仍由程式明確控制。

  • 生活分享

    API 額度與錯誤:費用、重試與成本控制

    Gemini API 的費用取決於模型、輸入輸出、服務模式及使用的工具;速率限制則決定你的專案在一段時間內能送出多少工作。本篇教你找到真正對應的用量頁面、估算一次檔案處理成本、分類錯誤,並設計有限重試與停止條件,避免把每個失敗都當成多按一次就能解決。

  • 生活分享

    API 檔案與 JSON:結構化輸出及驗證

    Gemini API 可以讀取 PDF,再把結果整理成指定的 JSON 結構。本篇用虛構活動公告示範檔案輸入、欄位設計與本地驗證。學完後,你會知道「收到合法 JSON」與「內容確實來自檔案」是兩件需要分別檢查的事,並能保留缺漏資訊而不讓模型自行補齊。

  • 生活分享

    AI Studio 與第一個 Gemini API 呼叫

    Google AI Studio 是試用模型與建立 Gemini API 金鑰的開發入口。本篇從一個簡單提示詞開始,帶你建立獨立專案環境,分別用 Python 與 JavaScript 呼叫 API。完成後,你會知道網頁試跑、程式執行與帳號用量各自在哪裡確認,不再把消費者版 Gemini 的操作直接套程式式。

最新旅遊情報攻略

資料來源

生活分享