質量是團隊的責任,不只是測試的責任。

質量的定義與責任#

質量不是測出來的,而是設計和開發出來的。質量保障是整個團隊的責任,不只是 QA 的責任。

寶玉在《軟體工程之美》中強調:

很多團隊認為「測試保證質量」,這是錯誤的。測試只能發現問題,不能保證質量。質量來自每一個環節的認真對待。

質量的成本#

flowchart TD
    subgraph P [💰 預防成本 - 最低]
        P1[代碼規範]
        P2[設計評審]
        P3[培訓]
        P4[工具投入]
    end

    subgraph E [💵 評估成本]
        E1[代碼評審]
        E2[測試執行]
        E3[質量審計]
        E4[監控告警]
    end

    subgraph I [💸 內部失敗成本]
        I1[Bug 修復]
        I2[返工重做]
        I3[延期]
        I4[團隊士氣]
    end

    subgraph O [💔 外部失敗成本 - 最高]
        O1[客戶投訴]
        O2[賠償損失]
        O3[品牌受損]
        O4[信任喪失]
    end

    P -->|投資不足| E
    E -->|發現不及時| I
    I -->|流入生產| O

    style P fill:#c8e6c9
    style E fill:#fff9c4
    style I fill:#ffe0b2
    style O fill:#ffcdd2

在早期發現和修復問題的成本最低。投資於預防,而不是事後補救。

測試策略#

測試金字塔#

經典的測試金字塔模型

         /\
        /  \
       / UI \          少量端到端測試
      /------\
     / 集成   \        適量集成測試
    /----------\
   /   單元     \      大量單元測試
  /--------------\

各層測試的特點

測試類型速度成本覆蓋範圍定位問題
單元測試小(單個函數/類)精準
集成測試中(多個組件)中等
E2E 測試大(完整流程)模糊

自動化測試#

寶玉關於自動化測試的建議:

值得自動化的:
├── 核心業務流程
├── 頻繁執行的回歸測試
├── 需要大量數據的測試
└── CI/CD 流水線中的測試

不一定要自動化的:
├── 一次性的測試
├── 經常變化的 UI 測試
├── 探索性測試
└── 用戶體驗測試

測試覆蓋率#

追求高覆蓋率,忽略測試質量。100% 覆蓋率不等於沒有 Bug。

合理的覆蓋率目標

  • 核心業務邏輯:80%+
  • 工具類/基礎設施:60%+
  • UI 組件:根據情況,不強求
  • 整體:60-80%

比覆蓋率更重要的

  • 測試是否覆蓋了關鍵路徑
  • 測試是否真的能發現問題
  • 測試是否容易維護

代碼質量#

代碼審查#

為什麼要做 Code Review

  • 發現 Bug 和設計問題
  • 知識共享
  • 保持代碼一致性
  • 建立質量文化

Code Review 檢查清單

mindmap
  root((Code Review))
    ✅ 功能正確性
      是否實現了需求?
      邊界條件處理了嗎?
      錯誤處理完善嗎?
      有沒有明顯的 Bug?
    🏗️ 設計質量
      設計是否合理?
      是否遵循設計模式?
      是否過度設計?
      是否有重複代碼?
    📖 可讀性
      命名是否清晰?
      是否需要註釋?
      邏輯是否容易理解?
      是否符合編碼規範?
    🔒 安全性
      有沒有安全漏洞?
      輸入是否驗證?
      是否有敏感資訊洩露?
      權限是否正確檢查?

靜態分析#

常用的靜態分析工具

  • 語法檢查(ESLint、Pylint)
  • 類型檢查(TypeScript、mypy)
  • 安全掃描(SonarQube、Snyk)
  • 複雜度分析

把靜態分析集成到 CI 流程中,問題代碼不允許合入。這比事後發現問題成本低得多。

上線與發布#

發布策略#

寶玉介紹的發布方式:

滾動發布(Rolling Update)

  • 逐步替換舊版本
  • 過程中新舊版本共存
  • 可以隨時回滾

藍綠部署(Blue-Green Deployment)

  • 準備兩套環境
  • 切換流量到新環境
  • 問題時快速切回

金絲雀發布(Canary Release)

  • 先給小部分用戶使用新版本
  • 觀察指標正常後逐步擴大
  • 發現問題只影響少量用戶
選擇建議:
├── 小更新:滾動發布
├── 大更新:金絲雀發布
├── 關鍵系統:藍綠部署
└── 多種組合使用

灰度發布實踐#

灰度的維度

  • 按用戶 ID(內部用戶優先)
  • 按地區(某個城市先上)
  • 按比例(5% → 20% → 50% → 100%)
  • 按設備(iOS 先上,Android 後上)

灰度過程中的監控

  • 錯誤率
  • 響應時間
  • 業務指標
  • 用戶反饋

灰度不是萬能的。如果問題在灰度階段沒發現,全量後可能更難發現。灰度階段要認真監控。

安全實踐#

安全左移#

寶玉提出「安全左移」的概念:

安全問題越早發現成本越低。不要等到上線前才做安全測試。

各階段的安全實踐

階段安全活動
需求安全需求分析、威脅建模
設計安全設計評審
開發安全編碼規範、代碼審查
測試安全測試、滲透測試
部署配置審查、漏洞掃描
運維監控、響應、更新

常見安全問題#

OWASP Top 10(簡化版):

注入攻擊:
├── SQL 注入
├── 命令注入
└── 防護:參數化查詢、輸入驗證

認證問題:
├── 弱密碼
├── Session 管理
└── 防護:多因素認證、安全會話

敏感數據:
├── 數據洩露
├── 傳輸不加密
└── 防護:加密存儲、HTTPS

訪問控制:
├── 越權訪問
├── 權限繞過
└── 防護:嚴格權限檢查

永遠不要信任用戶輸入。所有外部輸入都要驗證和過濾。

生產事故處理#

事故響應流程#

喬新亮分享的事故處理原則:

flowchart TD
    subgraph D [🔔 發現階段]
        D1[監控告警] --> D2[快速確認問題]
        D3[用戶反饋] --> D2
        D4[內部發現] --> D2
    end

    subgraph R [⚡ 響應階段]
        R1[組織響應團隊] --> R2[判斷影響範圍]
        R2 --> R3[決定處理策略]
        R3 --> R4[對外溝通]
    end

    subgraph H [🔧 處理階段]
        H1[🚨 止血優先] --> H2[修復問題]
        H2 --> H3[驗證恢復]
        H1 -.- H1a["恢復服務最優先"]
    end

    subgraph P [📝 復盤階段]
        P1[時間線梳理] --> P2[根因分析 5 Why]
        P2 --> P3[改進措施]
        P3 --> P4[經驗分享]
    end

    D --> R --> H --> P

    style D fill:#ffebee
    style R fill:#fff3e0
    style H fill:#e8f5e9
    style P fill:#e3f2fd

事後復盤#

復盤的目的是學習和改進,不是追責。如果復盤變成追責會議,以後就沒人敢報告問題了。

好的復盤會議

  • 聚焦系統和流程,而非個人
  • 鼓勵誠實說出問題
  • 產出具體的改進措施
  • 跟進改進的執行

復盤報告模板

mindmap
  root((復盤報告))
    📋 事故概述
      時間
      影響範圍
      持續時間
    ⏱️ 時間線
      詳細的事件發展過程
    🔍 根因分析
      直接原因
      根本原因(用 5 Why 分析)
    📊 影響評估
      業務影響
      用戶影響
    🛠️ 改進措施
      短期修復
      長期改進
      責任人和時間表

本章要點#

  1. 質量是團隊責任:不只是測試的責任
  2. 測試金字塔:大量單元測試,適量集成測試,少量 E2E
  3. Code Review:發現問題、共享知識、建立文化
  4. 灰度發布:逐步上線,邊發布邊監控
  5. 安全左移:越早發現安全問題成本越低
  6. 復盤不追責:目的是學習和改進