実務では「開発用と本番用でテストデータを切り替える」仕組みをCI/CDに組み込むことで、環境ごとに適切なテストを自動実行できます。
基本の考え方
- テストデータを外部ファイルに分ける
- 例:
test_cases_dev.jsonとtest_cases_prod.json
- 例:
- 環境変数でどのファイルを使うか指定する
- CI/CDパイプラインで
ENV=devやENV=prodを設定
- CI/CDパイプラインで
- テストコードで環境変数を読み込む
os.environを使ってファイルを切り替える
- CI/CD設定ファイルで環境ごとにジョブを分ける
プロジェクト構成例
project/
├── myapp.py
├── tests/
│ ├── test_app.py
│ ├── test_cases_dev.json
│ └── test_cases_prod.json
└── .github/
└── workflows/
└── ci.yml
テストコード例(環境変数で切り替え)
import json
import os
import pytest
from myapp import can_access
def load_cases():
env = os.environ.get("ENV", "dev") # デフォルトは開発用
filename = f"tests/test_cases_{env}.json"
with open(filename) as f:
return json.load(f)
@pytest.mark.parametrize("case", load_cases())
def test_can_access(case):
assert can_access(case["age"], case["is_member"], case["has_invite_code"]) == case["expected"]
PythonENV=dev→test_cases_dev.jsonを読み込むENV=prod→test_cases_prod.jsonを読み込む
GitHub Actions設定例(CI/CD)
name: CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
test-dev:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: "3.11"
- run: pip install -r requirements.txt pytest
- name: Run dev tests
run: ENV=dev pytest
test-prod:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: "3.11"
- run: pip install -r requirements.txt pytest
- name: Run prod tests
run: ENV=prod pytest
- test-dev ジョブ → 開発用データでテスト
- test-prod ジョブ → 本番用データでテスト
実務的な工夫
- 環境ごとに異なるテストデータを管理(開発用は簡易ケース、本番用は厳密ケース)
- CI/CDで並列実行 → 開発・本番両方のテストを同時に走らせる
- 環境変数や設定ファイルで切り替え → GitHub Actionsだけでなく、GitLab CIやAzure DevOpsでも同様に可能

