---
title: AI 生成 Code 怎麼測 — Copilot / Cursor 寫的 Code 給 QA 的新挑戰
description: GitHub Copilot / Cursor / Claude Code 等 AI 工具產出的 code 風險與測試策略。Hallucination 模式、Security 漏洞、Edge case 漏洞、隱藏的相依性、QA 的新角色。
category: ai-qa
tags: [ai-code, copilot, cursor, vibe-coding, code-quality]
date: 2026-06-17
faq:
  - q: Copilot 寫的 code 比人寫的多 bug 嗎？
    a: 研究顯示 +40% 表面 bug。GitClear 2024 數據顯示 code churn 在 Copilot 採用後增加、duplicate code 也增加。但「淺層 bug」可被 lint + test 抓、「深層 bug」反而隱藏更久。
  - q: AI 生 code 最危險的 bug 類型？
    a: 1) 編造 API（不存在的函式）；2) 過時 library 用法；3) Security 漏洞（SQL injection / XSS 沒過濾）；4) Race condition；5) Error handling 不一致。
  - q: QA 在 AI-driven dev workflow 該做什麼？
    a: 不再只測「結果」、也測「AI 出的 code 是不是業務邏輯」。多花時間 spec review + edge case 列舉 + integration test、少花時間在 boilerplate test。
  - q: 「Vibe Coding」是什麼？
    a: Andrej Karpathy 2025-02 用詞 — 指 dev 不看 code、只用 AI 對話寫程式。QA 變唯一懂 system 的人。風險高、責任大。
---

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

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

## AI 寫 code 風險地圖

```mermaid
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）

```mermaid
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

```typescript
// 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 用法

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

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

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

### 3. Security 漏洞

```python
# 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](/automation/security-testing-owasp.html)）

### 4. Race condition

```typescript
// 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 不一致

```typescript
// 同 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 的新角色

```mermaid
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 的人

```mermaid
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 守門

```yaml
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 |

## 反模式

```mermaid
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 工具箱](/ai-qa/ai-toolkit-for-qa.html)
- [Self-healing Tests with LLM](/ai-qa/self-healing-tests.html)
- [Security Testing — OWASP Top 10](/automation/security-testing-owasp.html)
