
Pythonでテストを自動化する際に欠かせないライブラリのひとつが pytest(パイテスト) です。
シンプルな記述で強力なテストが書けるため、初心者からプロの開発者まで幅広く利用されています。
この記事では、pytestの基本的な使い方から実務で役立つ注意点まで、初心者向けにわかりやすく解説します。
pytestとは?
pytestは、Python標準ライブラリの unittest
よりも「シンプルで直感的にテストが書ける」テストフレームワークです。
テストの自動実行、例外処理の検証、前処理・後処理の共通化など、機能が豊富で、学習コストも低いのが特徴です。
特徴
- シンプルな構文:関数名を
test_
で始めるだけでテストとして認識される - assert構文が使える:標準の
assert
をそのまま利用可能 - 自動探索機能:特定のフォルダ内のテストを自動で検出・実行
- 豊富なプラグイン:カバレッジ測定やHTMLレポート出力も簡単に追加できる
pytestの基本的な書き方
たとえば、次のような関数をテストしたいとします。
1 2 3 4 5 6 7 |
# sample.py def add(a, b): return a + b def divide(a, b): return a / b |
この関数を pytest でテストする場合は、以下のように書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# test_sample.py import pytest from sample import add, divide def test_add(): assert add(2, 3) == 5 assert add(-1, 1) == 0 def test_divide_by_zero(): # ZeroDivisionError が発生するかを確認 with pytest.raises(ZeroDivisionError): divide(1, 0) |
【ポイント】
- 関数名を
test_
で始めるだけでpytestが自動認識 assert
で期待値と実際の値を比較- 例外が発生するかどうかも
pytest.raises()
で簡単に確認できる
pytestの実行方法
pytestを実行するには、コマンドラインで次のように入力します。
1 2 |
pytest |
すると、pytestはカレントディレクトリ以下の test_*.py
または *_test.py
ファイルを自動的に探索して実行します。
実行結果の例:
1 2 3 4 5 6 7 |
============================= test session starts ============================= collected 2 items test_sample.py .. [100%] ============================== 2 passed in 0.02s ============================== |
.
は成功を意味し、もしテストが失敗すれば F
(Fail)が表示されます。
補足
pytestの探索ルールは pytest.ini
や pyproject.toml
でカスタマイズ可能です。
1 2 3 4 5 |
[pytest] python_files = test_*.py *_tests.py python_functions = test_* check_* python_classes = Test* Check* |
pytestでよく使うオプション
pytestには、実行を便利にするオプションが多数用意されています。
ここではよく使う代表的なものを紹介します。
① 特定のテストファイルを実行
1 2 |
pytest test_sample.py |
② 特定のテスト関数を実行
1 2 |
pytest test_sample.py::test_add |
③ 詳細表示モード(-v)
1 2 |
pytest -v |
例:
1 2 3 |
test_sample.py::test_add PASSED test_sample.py::test_divide_by_zero PASSED |
④ print出力を表示(-s)
1 2 |
pytest -s |
pytestはデフォルトで print()
の出力を抑制します。
デバッグで出力を確認したいときに便利です。
⑤ 実行時間が長いテストを確認(--durations)
1 2 |
pytest --durations=5 |
テスト全体のパフォーマンスを分析する際に役立ちます。
pytestの活用例:前処理・後処理を共通化する(fixture)
複数のテストで同じデータや準備処理を使う場合は、@pytest.fixture
を使うと便利です。
fixtureは「テストの下準備を自動化する仕組み」です。
1 2 3 4 5 6 7 8 9 |
import pytest @pytest.fixture def sample_data(): return [1, 2, 3] def test_sum(sample_data): assert sum(sample_data) == 6 |
【ポイント】
@pytest.fixture
をつけた関数は「共通の準備処理」を定義する場所になります。- テスト関数でその関数名(例:
sample_data
)を引数として指定すると、自動的にその戻り値が注入されます。 - 複数のテスト関数で同じfixtureを使い回すことができるので、重複した初期化コードを書く必要がなくなります。
fixtureを使うと、テストごとに同じ準備処理を書く必要がなくなり、コードがすっきりします。
pytestを使うときの注意点
① 命名ルールを守る
pytestが自動でテストを検出するためには、以下の命名規則を守る必要があります。
対象 | 規則 |
---|---|
テストファイル名 | test_*.py (推奨)または *_test.py |
テスト関数名 | test_ で始める |
テストクラス名 | Test で始める(大文字) |
例:tests/test_sample.py
② assert文の使い方に注意
assert
で比較する際は、期待値と実際の結果 を明確に書きましょう。
assert True
のような無意味なテストは避けます。
③ 外部依存があるテストはmockを使う
API通信やデータベース接続など、外部要因に依存するテストは不安定になりがちです。
unittest.mock
や pytest-mock
を活用して、外部処理をモック化しましょう。
まとめ
今回は pytest を解説しました。
- pytestはシンプルかつ強力なPython用テストフレームワーク
test_
で始まる関数とassert
で簡単にテストを書ける-v
,-s
,--durations
などの便利なオプションで柔軟に制御できるpytest.raises()
やfixture
を使えば、例外テストや共通処理も簡単- ファイル・関数の命名ルールを守ることが重要
pytestを導入すれば、手動確認を減らして、バグの早期発見や品質向上につながります。
まずは小さな関数のテストから始めて、少しずつ自動化の幅を広げていきましょう。