テストを書く習慣がなかなかつかないまま、なんとなくコードを書き続けていたんですが、ある日「あ、これ壊れてる」に気づくのが毎回本番後という状況に嫌気が差して、ちゃんと 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 について扱う予定です。テストを効率的に書く仕組みがだんだん整ってきますよ。

