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 句
- AI 寫 code 越普及、QA 越重要
- 每篇 AI code 都假設「有幻覺 + 有 security 漏洞」
- Coverage 不代表品質、要看 edge case 覆蓋
- 建 CI 8 個守門關卡
- 學會用 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