還記得 30 天前,我們從一個簡單的 assert 1 + 1 == 2
開始嗎?
今天,我們不僅完成了完整的 Todo API,更重要的是建立了 TDD 思維。這趟旅程的終點,正是你成為更好開發者的起點。
今天我們要完成最後一塊拼圖:
在部署前,讓我們確認所有測試都通過:
# 執行所有測試
pytest
# 檢查測試覆蓋率
pytest --cov=src --cov-report=term-missing
# 執行類型檢查
mypy src/
# 執行程式碼品質檢查
ruff check src/
black --check src/
確保輸出顯示:
# 建立 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
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/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 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
技術 | 掌握程度 | 實戰應用 |
---|---|---|
pytest 基礎 | ⭐⭐⭐⭐⭐ | 斷言、測試結構、生命週期 |
TDD 流程 | ⭐⭐⭐⭐⭐ | 紅綠重構循環 |
測試替身 | ⭐⭐⭐⭐ | Mock、Stub、Spy |
測試策略 | ⭐⭐⭐⭐ | 單元測試、整合測試 |
FastAPI | ⭐⭐⭐⭐ | RESTful API 開發 |
資料庫測試 | ⭐⭐⭐⭐ | SQLAlchemy、交易回滾 |
CI/CD | ⭐⭐⭐ | GitHub Actions |
Roman Numeral Converter (Day 11-17)
Todo API (Day 18-29)
def old_development_style():
# 寫一大堆程式碼
# 手動測試
# 發現 bug
# 修改程式碼
# 祈禱沒有破壞其他功能
# 重複無限循環...
pass
def tdd_development_style():
# 先寫測試定義需求
# 寫最少的程式碼通過測試
# 重構優化程式碼
# 測試保護不怕改壞
# 持續自信地前進!
pass
def message_to_future_self():
"""30 天 TDD 旅程的收穫"""
learnings = {
"技術成長": "從測試小白到 TDD 實踐者",
"思維轉變": "從事後補測試到測試驅動開發",
"程式品質": "從擔心改壞到自信重構",
"開發效率": "從反覆除錯到一次到位"
}
principles = [
"測試不是負擔,是開發的助力",
"好的測試就是最好的文件",
"TDD 不只是技術,更是思維方式",
"持續學習,持續進步"
]
return {
"過去": "感謝 30 天前開始這趟旅程的自己",
"現在": "恭喜完成挑戰,你做到了!",
"未來": "帶著 TDD 思維,寫出更好的程式碼"
}
最後的任務:
本地驗證
# 確保所有測試通過
pytest
# 建構並啟動容器
docker-compose up --build
推送程式碼
git add .
git commit -m "feat: complete todo api with full test coverage"
git push origin main
部署上線
30 天前,我們從零開始學習 TDD。今天,我們不僅完成了完整的專案,更重要的是建立了測試優先的開發思維。
這不是結束,而是開始。TDD 的精髓不在於技術,而在於持續追求更好的程式碼品質。每一個測試都是對未來的承諾,每一次重構都是對品質的堅持。
記住:
感謝你完成這 30 天的挑戰!現在,帶著 TDD 的力量,去創造更棒的軟體吧!
恭喜完成 30 天 TDD 實戰挑戰!
願測試與你同在,願程式碼永遠優雅!
感謝閱讀 30 天系列文章,歡迎持續關注 TDD 實踐之路!