iT邦幫忙

2025 iThome 鐵人賽

DAY 30
0

前言:終點即起點

還記得 30 天前,我們從一個簡單的 assert 1 + 1 == 2 開始嗎?

今天,我們不僅完成了完整的 Todo API,更重要的是建立了 TDD 思維。這趟旅程的終點,正是你成為更好開發者的起點。

本日目標 🎯

今天我們要完成最後一塊拼圖:

  • 將 Todo API 部署到雲端
  • 設置 CI/CD 確保測試品質
  • 回顧 30 天的學習成果
  • 展望 TDD 的未來之路

一、部署前的最終檢查 ✅

在部署前,讓我們確認所有測試都通過:

# 執行所有測試
pytest

# 檢查測試覆蓋率
pytest --cov=src --cov-report=term-missing

# 執行類型檢查
mypy src/

# 執行程式碼品質檢查
ruff check src/
black --check src/

確保輸出顯示:

  • ✅ 所有測試通過
  • ✅ 測試覆蓋率 > 90%
  • ✅ 無類型錯誤
  • ✅ 程式碼符合規範

二、準備部署設定 🔧

建立 requirements.txt

# 建立 requirements.txt
fastapi==0.109.0
uvicorn==0.27.0
sqlalchemy==2.0.25
alembic==1.13.1
pydantic==2.5.3
python-jose[cryptography]==3.3.0
passlib[bcrypt]==1.7.4
python-multipart==0.0.6

建立 Dockerfile

# 建立 Dockerfile
FROM python:3.11-slim
WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY src/ ./src/
ENV PYTHONPATH=/app

CMD uvicorn src.todo.main:app --host 0.0.0.0 --port 8000

三、設置 GitHub Actions CI/CD 🚀

建立測試工作流程

# 建立 .github/workflows/test.yml
name: Tests

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    
    strategy:
      matrix:
        python-version: [3.9, 3.10, 3.11]
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v4
      with:
        python-version: ${{ matrix.python-version }}
    
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
        pip install pytest pytest-cov mypy ruff black
    
    - name: Run tests with coverage
      run: |
        pytest --cov=src --cov-report=xml --cov-report=term
    
    - name: Check types
      run: mypy src/
    
    - name: Check code quality
      run: |
        ruff check src/
        black --check src/
    
    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v3
      with:
        file: ./coverage.xml
        fail_ci_if_error: true

四、本地測試部署

在正式部署前,先在本地測試:

# 建構 Docker 映像
docker-compose build

# 啟動服務
docker-compose up -d

# 檢查服務狀態
docker-compose ps

# 測試 API
curl http://localhost:8000/health

# 查看日誌
docker-compose logs -f api

五、部署到雲端 ☁️

使用 Fly.io 部署(範例)

# 安裝 Fly CLI
curl -L https://fly.io/install.sh | sh

# 初始化並部署應用
fly launch --name todo-api-tdd
fly deploy

# 設置生產環境變數
fly secrets set SECRET_KEY="your-production-secret-key"
fly secrets set DATABASE_URL="postgresql://..."

# 查看狀態
fly status

六、30 天學習成果總覽 📊

技術堆疊掌握度

技術 掌握程度 實戰應用
pytest 基礎 ⭐⭐⭐⭐⭐ 斷言、測試結構、生命週期
TDD 流程 ⭐⭐⭐⭐⭐ 紅綠重構循環
測試替身 ⭐⭐⭐⭐ Mock、Stub、Spy
測試策略 ⭐⭐⭐⭐ 單元測試、整合測試
FastAPI ⭐⭐⭐⭐ RESTful API 開發
資料庫測試 ⭐⭐⭐⭐ SQLAlchemy、交易回滾
CI/CD ⭐⭐⭐ GitHub Actions

完成的專案

  1. Roman Numeral Converter (Day 11-17)

    • ✅ 完整 TDD 開發,100% 測試覆蓋率
  2. Todo API (Day 18-29)

    • ✅ RESTful API 設計,完整測試套件

測試統計

  • 總測試數量:140+ 個
  • 整體覆蓋率:94.7%
  • 核心邏輯:100%

七、關鍵學習里程碑

  • 第一週:基礎扎根(測試基礎、紅綠重構、生命週期)
  • 第二週:技巧精進(測試替身、Roman Numeral Kata)
  • 第三週:實戰應用(FastAPI 開發、資料庫測試)
  • 第四週:整合完成(認證系統、功能整合、部署上線)

八、TDD 帶來的改變 💡

Before TDD

def old_development_style():
    # 寫一大堆程式碼
    # 手動測試
    # 發現 bug
    # 修改程式碼
    # 祈禱沒有破壞其他功能
    # 重複無限循環...
    pass

After TDD

def tdd_development_style():
    # 先寫測試定義需求
    # 寫最少的程式碼通過測試
    # 重構優化程式碼
    # 測試保護不怕改壞
    # 持續自信地前進!
    pass

九、給未來的自己 📝

def message_to_future_self():
    """30 天 TDD 旅程的收穫"""
    
    learnings = {
        "技術成長": "從測試小白到 TDD 實踐者",
        "思維轉變": "從事後補測試到測試驅動開發",
        "程式品質": "從擔心改壞到自信重構",
        "開發效率": "從反覆除錯到一次到位"
    }
    
    principles = [
        "測試不是負擔,是開發的助力",
        "好的測試就是最好的文件",
        "TDD 不只是技術,更是思維方式",
        "持續學習,持續進步"
    ]
    
    return {
        "過去": "感謝 30 天前開始這趟旅程的自己",
        "現在": "恭喜完成挑戰,你做到了!",
        "未來": "帶著 TDD 思維,寫出更好的程式碼"
    }

實戰練習:部署你的 API

最後的任務:

  1. 本地驗證

    # 確保所有測試通過
    pytest
    
    # 建構並啟動容器
    docker-compose up --build
    
  2. 推送程式碼

    git add .
    git commit -m "feat: complete todo api with full test coverage"
    git push origin main
    
  3. 部署上線

    • 選擇你喜歡的雲端平台
    • 設置環境變數
    • 監控部署狀態
    • 驗證線上服務

總結:TDD 之旅的延續

30 天前,我們從零開始學習 TDD。今天,我們不僅完成了完整的專案,更重要的是建立了測試優先的開發思維。

這不是結束,而是開始。TDD 的精髓不在於技術,而在於持續追求更好的程式碼品質。每一個測試都是對未來的承諾,每一次重構都是對品質的堅持。

記住:

  • 紅燈 提醒我們先思考再行動
  • 綠燈 給我們前進的信心
  • 重構 讓程式碼保持優雅

感謝你完成這 30 天的挑戰!現在,帶著 TDD 的力量,去創造更棒的軟體吧!

下一步行動 📋

  • [ ] 部署你的 Todo API
  • [ ] 分享你的學習心得
  • [ ] 挑選下一個 TDD 專案
  • [ ] 持續精進測試技巧
  • [ ] 成為 TDD 的推廣者

恭喜完成 30 天 TDD 實戰挑戰!

願測試與你同在,願程式碼永遠優雅!


感謝閱讀 30 天系列文章,歡迎持續關注 TDD 實踐之路!


上一篇
Day 29 - 整合實戰
系列文
Python pytest TDD 實戰:從零開始的測試驅動開發30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言