【第1回】Python pytest 入門 — インストールから最初のテスト作成まで基本を押さえよう

プログラミング

テストを書く習慣がなかなかつかないまま、なんとなくコードを書き続けていたんですが、ある日「あ、これ壊れてる」に気づくのが毎回本番後という状況に嫌気が差して、ちゃんと pytest を覚えることにしました。

このシリーズは全4回で、pytest の基礎から実践的な使い方までをひと通り扱う予定です。

  • 第1回(今回):インストール・最初のテスト・assert の書き方
  • 第2回:fixture の基本と conftest.py の使い方
  • 第3回:parametrize でテストをまとめる
  • 第4回:実践パターン(モック・例外テスト・GitHub Actions 連携)

第1回は「とにかく動かしてみる」がゴールです。難しい話は後回し。

この記事でわかること

  • pytest のインストール方法
  • 最初のテストコードの書き方
  • pytest の基本的な命名ルール
  • assert 文の書き方とよくあるパターン
  • テスト実行時の便利なオプション

pytest とは

Python のテストフレームワークはいくつかありますが、pytest は最も使われているツールのひとつです。標準ライブラリの unittest と比べると、クラスを書かなくていい・assert がシンプルに書ける・失敗時のメッセージが親切、という点で使い勝手がいいです。

個人的には、以前は「テストなんて後で書けばいい」と思ってたタイプだったので、本格的に pytest を使い始めたのは割と最近です。

pytest の特徴をざっくり挙げると:

  • test_ で始まる関数・ファイルを自動検出して実行してくれる
  • assert 文がそのまま使える(unittest みたいに assertEqual とか書かなくていい)
  • 失敗時に「何と何を比較して、どう違ったか」を出してくれる
  • fixture・parametrize など、便利な仕組みが揃っている

インストール

仮想環境を作って、その中に入れるのが基本です。

# 仮想環境を作成・有効化
python -m venv .venv
source .venv/bin/activate  # Mac/Linux

pip install pytest

バージョン確認はこちら。

pytest --version
# pytest 8.x.x

uv を使っている場合は uv add --dev pytest でもOKです。自分は最近 uv を使い始めたんですが、速くて快適ですね。

最初のテストを書いてみる

まずはシンプルな関数と、それに対するテストを書きます。

テスト対象の関数(calc.py):

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

テストファイル(test_calc.py):

from calc import add, subtract

def test_add():
    assert add(2, 3) == 5

def test_subtract():
    assert subtract(10, 4) == 6

これだけです。クラスもいらない、setUp もいらない。

実行は pytest コマンドを叩くだけ:

$ pytest

========================= test session starts ==========================
collected 2 items

test_calc.py ..                                                   [100%]

========================== 2 passed in 0.01s ===========================

. がひとつで1テスト通過。気持ちいいですね、これ。

ファイルとディレクトリの命名ルール

pytest が自動検出するには、以下のルールに従う必要があります。

  • ファイル名:test_*.py または *_test.py
  • 関数名:test_ で始まる
  • クラス名(使う場合):Test で始まる

特定のテストを指定して実行したい場合は pytest テストファイル::テスト関数名 のように引数で指定できます。このルールを外れると pytest がテストとして認識しないので注意。最初ハマりがちなポイントです。

ディレクトリ構成はこんな感じが一般的です:

project/
├── src/
│   └── calc.py
├── tests/
│   └── test_calc.py
└── pyproject.toml

テストだけを tests/ フォルダに集めておくとあとあと管理しやすいです。

assert の書き方いろいろ

pytest では Python 標準の assert 文がそのまま使えます。unittest みたいに専用メソッドを覚える必要がないのがラクです。

def test_various_asserts():
    # 等値チェック
    assert 1 + 1 == 2

    # 不等値
    assert 1 + 1 != 3

    # リスト・辞書も普通に比較できる
    assert [1, 2, 3] == [1, 2, 3]
    assert {"key": "value"} == {"key": "value"}

    # in 演算子も使える
    assert "pytest" in "pytest is great"

    # True / False
    assert True
    assert not False

テストが失敗したときのメッセージが地味にすごくて、こんな感じで差分を出してくれます:

def test_fail_example():
    assert add(2, 3) == 99  # 意図的に失敗させる
FAILED test_calc.py::test_fail_example
AssertionError: assert 5 == 99
 +  where 5 = add(2, 3)

「add(2, 3) の結果が 5 で、それを 99 と比較した」という情報がそのまま出てきます。デバッグが楽です。

よく使う実行オプション

覚えておくと便利なオプションをまとめておきます。

# 詳細表示(テスト名も出る)
pytest -v

# 最初の失敗で止める
pytest -x

# 特定のファイルだけ実行
pytest tests/test_calc.py

# 特定の関数だけ実行
pytest tests/test_calc.py::test_add

# 失敗したテストだけ再実行
pytest --lf

# 標準出力も表示(print() の内容を確認したいとき)
pytest -s

個人的には -v-x の組み合わせ(pytest -vx)を一番よく使います。失敗したら即停止して、ちゃんとメッセージを読む、という使い方です。

※この記事にはプロモーションが含まれます

ちなみに、お名前.com レンタルサーバー(WordPressに特化した高速レンタルサーバー。月額990円〜、独自ドメイン実質0円)も気になっています。お名前.com レンタルサーバー

まとめ

pytest の基本的な使い方——インストール、テストファイルの作成、assert の書き方、実行方法——をひと通り見てきました。命名ルールさえ覚えておけば、あとは通常の Python コードと変わらずテストが書けます。

次回は fixture の使い方と conftest.py について扱う予定です。テストを効率的に書く仕組みがだんだん整ってきますよ。

📚 シリーズ「Python pytest 入門」(第1回 / 全4回)

→ 次回の記事: 公開後にリンクが追加されます

参考になったらクリックしてもらえると嬉しいです!

Blogmura ProgrammingProgramming Ranking
タイトルとURLをコピーしました