初心者向け！サンプル付きコードで学ぶPyTest

## はじめに

PyTestは、Pythonのための強力で使いやすいテストフレームワークです。このブログ記事では、PyTestの基本的な使い方から始め、初心者でも理解しやすい形で15の章に分けて解説します。各章では、実際のコード例を用いてPyTestの機能を説明します。

### 1. PyTestとは

PyTestは、Pythonのコードをテストするためのフレームワークで、簡潔な記述と強力な機能を兼ね備えています。PyTestは、少ないボイラープレートコードでテストを記述でき、assert文を使用してテストを行うため、非常に直感的です。

### 2. 環境のセットアップ

まず、PythonとPyTestをインストールします。仮想環境を使用することをお勧めします。以下のコマンドで仮想環境を作成し、アクティブ化します。

```bash
$ python3 -m venv venv
$ source venv/bin/activate
```

次に、PyTestをインストールします。

```bash
$ pip install pytest
```

### 3. 初めてのテスト

PyTestを使用して最初のテストを作成します。`test_sample.py`というファイルを作成し、以下のコードを記述します。

```python
def test_addition():
    assert 1 + 1 == 2
```

このテストは、1 + 1が2であることを確認します。テストを実行するには、以下のコマンドを使用します。

```bash
$ pytest
```

### 4. テストの組織化と命名

テストファイルは`test_`で始まるか、`_test`で終わる名前にする必要があります。これにより、PyTestは自動的にテストを検出します。

### 5. テストの実行

PyTestは、ディレクトリ内のすべてのテストを自動的に実行します。特定のテストだけを実行したい場合は、以下のようにテスト名を指定できます。

```bash
$ pytest -k "test_addition"
```

### 6. フィクスチャの使用

フィクスチャは、テストの前に必要なセットアップを行うための機能です。以下の例では、フィクスチャを使用してテストの前にデータベース接続を設定します。

```python
import pytest

@pytest.fixture
def db_connection():
    return "Database Connection"

def test_db(db_connection):
    assert db_connection == "Database Connection"
```

### 7. パラメータ化

PyTestの`@pytest.mark.parametrize`デコレータを使用すると、同じテストに異なる入力を与えることができます。

```python
import pytest

@pytest.mark.parametrize("input,expected", [(1, 2), (2, 3), (3, 4)])
def test_increment(input, expected):
    assert input + 1 == expected
```

### 8. 例外のテスト

特定の例外が発生することを確認するには、`pytest.raises`を使用します。

```python
import pytest

def test_zero_division():
    with pytest.raises(ZeroDivisionError):
        1 / 0
```

### 9. モンキーパッチ

モンキーパッチを使用して、テスト中に特定の関数やメソッドの動作を変更できます。

```python
def test_monkeypatch(monkeypatch):
    def mock_return():
        return "mocked!"

    monkeypatch.setattr("builtins.input", lambda _: "mocked!")
    assert input() == "mocked!"
```

### 10. テストのスキップとマーク

テストをスキップしたり、特定の条件でのみ実行したりすることができます。

```python
import pytest

@pytest.mark.skip(reason="Not implemented yet")
def test_not_implemented():
    assert False
```

### 11. カバレッジの測定

`pytest-cov`プラグインを使用して、テストのカバレッジを測定できます。

```bash
$ pip install pytest-cov
$ pytest --cov=your_module
```

### 12. プラグインの利用

PyTestには多くのプラグインがあり、機能を拡張できます。例えば、`pytest-xdist`を使用してテストを並列実行できます。

### 13. テストのベストプラクティス

テストを書く際のベストプラクティスを紹介します。テストはシンプルで、明確にすることが重要です。

```python
def test_sum():
    # Arrange
    a = 1
    b = 2
    expected = 3

    # Act
    result = a + b

    # Assert
    assert result == expected
```

### 14. PyTestの高度な機能

PyTestの高度な機能として、カスタムフィクスチャ、フック、プラグインの作成方法を紹介します。

```python
import pytest

# カスタムフィクスチャの作成
@pytest.fixture
def custom_data():
    return {"key": "value"}

def test_custom_data(custom_data):
    assert custom_data["key"] == "value"

# フックの使用
def pytest_runtest_setup(item):
    print(f"Setting up {item.name}")
```

### 15. PyTest-xdistでの並列テスト

`pytest-xdist`を使用すると、テストを並列で実行することができます。以下のコマンドでインストールします。

```bash
$ pip install pytest-xdist
```

テストを並列で実行するには、以下のコマンドを使用します。

```bash
$ pytest -n auto
```

このコマンドは、利用可能なCPUの数に応じてテストを並列に実行します[1][3][5]。

### 結論

PyTestは、Pythonのテストを簡単にし、効率的に行うための強力なツールです。このチュートリアルを通じて、PyTestの基本的な使い方を学びました。次は、実際のプロジェクトでPyTestを使用してみましょう。