pytest × GitHub Actions で始めるCI処理入門

# はじめに
「とりあえず動いたけど、将来の改修で壊れない保証がない...」  
そんな不安をなくす最短ルートが **CI（継続的インテグレーション）** の導入です。

本記事では、 **Pythonのユニットテストフレームワーク「pytest」** を使い、  
**GitHub ActionsでCIを自動化する方法**をステップ形式で紹介します。

## CIとは？

**CI（Continuous Integration）** とは、コードを頻繁にマージするチーム開発において、テストやビルドを自動で実行して品質を保つための仕組みです。

CIを導入することで、次のような恩恵があります：
- プッシュやPR作成のたびにテスト実行
- バグの早期検知
- コード品質の継続的な担保

## GitHub Actionsとは？

GitHub Actionsは、GitHubリポジトリ上でCI/CDを定義・実行できる無料のワークフローエンジンです。  
YAML形式で「何をトリガーに、どんな処理を行うか」を記述することで、自動化を実現します。

# 実際の処理について
今回は以下のような構成で、Docker環境上でpytestを実行し、CIを構成しています。
```
.
├── app/
│ └── calc.py # テスト対象の関数
├── tests/
│ └── test_calc.py # pytest によるテストケース
├── requirements.txt # 依存パッケージ
├── Dockerfile # テスト実行用イメージ
├── docker-compose.yml # コンテナ管理
└── .github/
└── workflows/
└── pytest.yml # GitHub Actionsの定義ファイル ←★
```


---

### 🔧 Dockerfile（pytest 実行用）

```Dockerfile
FROM python:3.11-slim

RUN apt-get update && apt-get install -y build-essential && rm -rf /var/lib/apt/lists/*

WORKDIR /code
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
ENV PYTHONPATH=/code
```

```txt:requirements.txt
pytest
pytest-cov
pytest-mock
```

```yml:docker-compose.yml
version: "3.8"

services:
  app:
    build: .
    volumes:
      - .:/code
    working_dir: /code
    command: >
      sh -c "PYTHONPATH=. pytest -q --cov=app --cov-report=term-missing"
```
## GitHub Actions の定義（pytest.yml）
```yml:pytest.yml
name: Run Pytest in Docker

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

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Install Docker Compose CLI
        run: |
          mkdir -p ~/.docker/cli-plugins/
          curl -SL https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
          chmod +x ~/.docker/cli-plugins/docker-compose
          docker compose version

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Build and run tests in Docker
        run: |
          docker compose up --build --abort-on-container-exit
```

GitHub Actionsは以下のように定義しています。


### on:
```
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
```
これは 「ワークフローをいつ動かすか」 を定義しています：

トリガー	説明
push	main ブランチに push されたときに実行される
pull_request	main ブランチに対して PR が作成・更新されたときに実行される

### jobs: test
これは 実行されるジョブの名前です（testという名前で定義）。

### runs-on: ubuntu-latest
このジョブは GitHub の提供する仮想マシン上で動作します。
ここでは ubuntu-latest という 最新のUbuntu環境を使用しています。

### steps:
以下は、CIで行う一連の処理（ステップ）です。

① コードのチェックアウト
```
- name: Checkout code
  uses: actions/checkout@v3
```
GitHub リポジトリの ソースコードをVM上にcloneする処理

これがないと、CI実行環境にコードが存在しません。

② Docker Buildx のセットアップ
```
- name: Set up Docker Buildx
  uses: docker/setup-buildx-action@v2
```
Docker のマルチプラットフォームビルドをサポートする buildx をセットアップします。

今回のような Docker Compose ビルドでも互換性確保のために 入れておくのが推奨です。

③ テスト用の Docker コンテナ実行
```
- name: Build and run tests in Docker
  run: |
    docker-compose up --build --abort-on-container-exit
```
このステップが pytest を実行する本番処理です。

- docker-compose up --build: 毎回Dockerイメージをビルドし直して、最新コードで実行

- --abort-on-container-exit: どれかのサービスが終了したら全体も終了させる（テストだけ終わればOK）

### 結果として何が起こるか？
このGitHub ActionsのCIは：

- コードがpushされたら自動で開始
- Ubuntu上で docker-compose を用いてテスト環境を構築
- pytest によるユニットテストとカバレッジが実行される
- 結果は GitHub Actions の UI で確認可能


### CIでよく行われるテスト一覧
今回やpytestを利用したユニットテストの前提ですが、普段は以下のようなことをCI時に処理を行います。

| 種別 | 内容 | ツール例 | 備考 |
|:-----------|:------------|:------------|:------------|
| ユニットテスト       | 関数単位の検証        | pytest, JUnit         | PR/Push時に常時         |
| 統合テスト     | モジュール間の連携      | DB+API など       | 定期実行やPR時         |
| E2Eテスト       | ユーザー操作を再現        | Cypress, Selenium         | 実行に時間がかかる         |
| Lintチェック         | コードスタイル確認          | flake8, black           | 最も軽量。全PR推奨         |
|型チェック | 型注釈の確認|mypy, tsc |バグ予防に効果大 |
|セキュリティテスト |脆弱性の検出 |Bandit, Dependabot | 定期実行も可|
|ビルド＆デプロイ確認 |本番環境へ向けた準備 |docker build, S3アップロード | デプロイ前に実行|


# 終わりに
CIを導入することで、「壊れていることに気づかない」状態を防ぐことができます。
pytest + GitHub Actions は、導入も簡単で、小規模プロジェクトから業務開発まで幅広く活用可能です。

ぜひ、あなたのプロジェクトにも取り入れてみてください！

# 補足リンク
pytest公式ドキュメント:https://docs.pytest.org/en/latest/
GitHub Actions公式ドキュメント:https://docs.pytest.org/en/latest/