AI 生成 Code 怎麼測 — Copilot / Cursor 給 QA 的新挑戰

「Dev 用 Copilot 寫 code 變 3 倍快、QA 接到的 bug 也變 5 倍多」 — 這是 2026 年大多公司的真實狀況。AI 寫 code 有它特有的 bug pattern、傳統 QA 方法抓不到。這篇給你新時代 framework。

AI 寫 code 風險地圖

mindmap
  root((AI Code<br>新風險))
    Hallucination 幻覺
      編造不存在 API
      過時 library 用法
      錯誤類型推斷
      不存在 method
    Surface vs Deep
      表面 bug 多
      但會被 lint 抓
      深層邏輯錯難發現
    Security
      SQL injection 沒過濾
      XSS 沒 escape
      Secrets in code
      過時 crypto
    重複度
      Duplicate code
      Copy-paste 模式
      技術債爆
    Edge case
      Happy path OK
      邊界漏洞多
      Error handling 不一致
    隱藏依賴
      偷加 dependency
      用過時 package
      License 風險

研究數據(2024-2025)

flowchart LR
    Y23[2023] --> Copilot[Copilot 採用爆]
    Copilot --> S1[GitClear 研究]
    S1 --> R1["Code churn +25%"]
    S1 --> R2["Duplicate code +17%"]
    S1 --> R3["Move code 操作 -39%"]

    Copilot --> S2[Stanford 研究]
    S2 --> SR1["Security vulnerabilities<br>+40% 含 AI code"]

    Copilot --> S3[Snyk / Sonar 2025]
    S3 --> SR2["LLM 寫的 code 有<br>已知 CVE 機率 +73%"]

    style R1 fill:#ef4444,color:#fff
    style R2 fill:#ef4444,color:#fff
    style SR1 fill:#ef4444,color:#fff
    style SR2 fill:#ef4444,color:#fff

結論:AI 不是讓 code 變好、是讓寫 code 變快、bug 變多。QA 工作量爆增、不是減少。

7 種 AI Code 特有 bug

1. 幻覺 API

// AI 寫的
import { useDebouncedCallback } from 'react-use';
const debouncedFn = useDebouncedCallback(handler, 500);

// 真實情況:'react-use' 沒有這 hook、是 use-debounce package 的
// → Build 過、runtime 爆

QA 對策: - ESLint + eslint-plugin-import 抓不存在的 import - 跑 build 在 CI 上強制

2. 過時 library 用法

// AI 寫的 — 用 React 17 寫法
class MyComponent extends React.Component {
  componentWillMount() { /* deprecated */ }
}

// React 18+ 已 deprecate
// 跑得起來但會 warning + 之後爆

QA 對策: - 升級 deprecated API checker - 看 console warnings

3. Security 漏洞

# AI 寫的
def search_users(query):
    sql = f"SELECT * FROM users WHERE name LIKE '%{query}%'"
    return db.execute(sql)

完美的 SQL Injection。AI 不會自動用 parameterized query。

QA 對策: - SAST 工具(Semgrep / CodeQL) - 跑 OWASP Top 10 測試(見 Security Testing

4. Race condition

// AI 寫的
async function transferMoney(from, to, amount) {
  const balance = await getBalance(from);
  if (balance < amount) throw new Error('Insufficient');
  await updateBalance(from, balance - amount);
  await updateBalance(to, await getBalance(to) + amount);
}

沒 transaction、沒 lock、雙寫 race

QA 對策: - Concurrent test case - 壓力測試(同時 100 個 request)

5. Edge case 漏

AI 寫 happy path 完美、邊界錯: - 空陣列 / null / undefined - 負數 / 零 / 極大值 - 字串含特殊字元 - 日期跨時區

QA 對策: - 等價分割 + 邊界值 test - Property-based testing(hypothesis / fast-check)

6. Error handling 不一致

// 同 codebase 同 dev 同 session 寫的兩個函式

async function fn1() {
  try { return await api1(); }
  catch (e) { throw new Error('API1 failed'); }
}

async function fn2() {
  return await api2().catch(e => { console.log(e); return null; });
}

錯誤處理風格不一致、QA 測試行為差。

QA 對策: - 強制 error handling 規範 - Test「失敗路徑」跟「成功路徑」一樣多

7. 隱藏依賴

AI 自動 npm install some-package、可能: - 是 typosquatted package(typo 攻擊) - 過期 / abandoned - License 衝突(GPL → 商用問題)

QA 對策: - Snyk / Socket.dev 掃 dependency - Dependabot alerts

QA 在 AI-Driven Dev 的新角色

flowchart LR
    Old[2023 QA] --> O1[測 dev 寫的 code]
    Old --> O2[找 bug]
    Old --> O3[寫 regression]

    New[2026 QA] --> N1["不只測結果<br>還測「這 code 對應到 spec 嗎」"]
    New --> N2[Spec 階段更深介入]
    New --> N3[補 dev 看不見的 edge case]
    New --> N4[Security / a11y / perf 等專業守門]
    New --> N5[Production observability 主要負責]

    style Old fill:#9ca3af,color:#fff
    style New fill:#10b981,color:#fff

Vibe Coding 時代 — QA 是唯一懂 system 的人

flowchart TD
    Vibe[Vibe Coding 工作流] --> Dev[Dev 用 Claude / Cursor 寫]
    Dev --> Quick[3 倍快出 feature]
    Quick --> Unknown[Dev 不完全懂自己的 code]
    Unknown --> Risk[上線後出事誰負責?]
    Risk --> QA[QA 變唯一懂 system 的人]
    QA --> NewSkill[QA 必須會讀 code + AI 一起對話]

    style Risk fill:#ef4444,color:#fff
    style QA fill:#a855f7,color:#fff

QA 的新技能:用 AI 反過來「審查」AI 寫的 code。

CI 整合:AI Code 守門

name: AI Code Guard

on: [pull_request]

jobs:
  ai-quality:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      # 1. Lint - 抓幻覺 API、過時用法
      - run: npx eslint --ext .ts,.tsx .

      # 2. SAST - 抓 security 漏洞
      - uses: github/codeql-action/init@v3
      - uses: github/codeql-action/analyze@v3
      - uses: returntocorp/semgrep-action@v1

      # 3. Dependency scan
      - uses: snyk/actions/node@master

      # 4. Build - 確認 import 對
      - run: npm run build

      # 5. Test - 確認業務邏輯
      - run: npm test

      # 6. Coverage - 強制覆蓋
      - run: npm run coverage
      - run: |
          COV=$(jq '.total.lines.pct' coverage/coverage-summary.json)
          if (( $(echo "$COV < 80" | bc -l) )); then exit 1; fi

      # 7. AI code review
      - uses: anc95/ChatGPT-CodeReview@main

QA 該設的 PR 守門條件

✓ Build pass
✓ Lint 0 errors
✓ All tests pass
✓ Coverage > 80%
✓ Snyk 0 high/critical
✓ Semgrep 0 security finding
✓ CodeRabbit / AI review 沒 P0/P1
✓ Reviewer 至少 1 個 senior approve

這 8 個全綠才能 merge

AI Code Review 工具

工具 用途
CodeRabbit PR 自動 AI review
Greptile 跨 repo 理解的 AI review
Codium PR-Agent Open source
Sourcery Refactor 建議
Sweep 自動寫 fix code

反模式

flowchart TD
    Anti[反模式] --> A1["完全信任 AI code、不 review"]
    Anti --> A2["test 只測 happy path"]
    Anti --> A3["AI 寫完直接 merge 不 build"]
    Anti --> A4["Coverage 高就放心"]
    Anti --> A5["不跑 SAST / Snyk"]
    Anti --> A6["QA 只跑 functional test"]

    style A1 fill:#ef4444,color:#fff
    style A2 fill:#ef4444,color:#fff
    style A3 fill:#ef4444,color:#fff
    style A4 fill:#ef4444,color:#fff
    style A5 fill:#ef4444,color:#fff
    style A6 fill:#ef4444,color:#fff

給 QA 的 5 句

  1. AI 寫 code 越普及、QA 越重要
  2. 每篇 AI code 都假設「有幻覺 + 有 security 漏洞」
  3. Coverage 不代表品質、要看 edge case 覆蓋
  4. 建 CI 8 個守門關卡
  5. 學會用 AI 審 AI 寫的 code

最後

AI 寫 code 不會殺掉 QA、是讓 QA 變得更稀缺、薪資更高。從建 CI 8 個守門 + 學會用 AI 抓 AI 的 bug 開始、半年後你會變 dev team 不可缺的「品質最後防線」。

延伸: - AI 共存的 QA 工具箱 - Self-healing Tests with LLM - Security Testing — OWASP Top 10