Pythonテストフレームワーク(Pytest)の基本的な使い方を解説

PyTestは、シンプルさと柔軟性を兼ね備えたPython用テストフレームワークです。本記事では、インストール方法から基本的な使い方、セットアップのコツ、応用的なテスト技法までを解説します。PyTestを使いこなし、テストプロセスを効率化しましょう!
PyTestとは何か?
PyTestの概要と特徴
PyTestは、Python用のテストフレームワークの1つです。シンプルな構文で記述できることが特徴で、単体テストで使う程度であれば少ない学習コストで覚えることができます。また、結合テスト、さらにはパラメータ化されたテストにも使えます。
- 簡潔で読みやすい
- 強力なアサーション機能
- パラメータ化テストや例外処理のテストに対応
この記事では、PyTestの使い方を紹介したいと思います。

個人で開発するのが主なので、自分の場合は「単体テスト・機能テスト」での利用がメインです
他のテストフレームワークとの違い
PyTest以外ではunittestなどが有名です。PyTestの方が優れていると言われますが、個人的には「単なる慣れの問題で、どれも大差ない」という印象です。好きなものを使えば良いと思いますが、PyTestはメジャーですし、1つ覚えるのならこれが良いと思います。
PyTestのインストール
インストール手順(pipを使用)
PyTestのインストールは非常に簡単です。
以下のコマンドを実行してください。
pip install pytest
インストールが完了したら、以下のコマンドでインストールが成功したかを確認できます。
pytest --version

私の場合は、pytest 8.3.4
と表示されました。
最初のテスト
基本的なテスト関数の書き方
PyTestの基本的なテストは、test_
で始まる関数を作成するだけです。
例えば、以下は簡単なテストコードです。assert
は、条件式がTrueではない時に、例外を投げる記述です。
def test_addition():
assert 1 + 1 == 2
PyTestの実行方法
上記のテストをPythonファイル(test_sample.py
)として保存し、以下のコマンドを実行することでテストを実行することができます。
pytest test_sample.py
成功したテスト、失敗したテストの結果がターミナルに表示されます。今回は成功するので、以下のような出力が行われます。
collected 1 item
test.py . [100%]
=============================================================== 1 passed in 0.01s ================================================================
テスト名の命名ルール
テスト名の命名
PyTestを利用する場合、テスト関数名やファイル名をわかりやすく命名することが重要です。一般的には以下のルールを守ると良いと思います。
- テスト関数名は
test_
で始める - ファイル名は
test_
または_test
を含める - テスト内容が一目でわかる名前にする
アサーション(assert
)の使い方
PyTestでは、アサーションにはPythonの標準構文を使用します。
assert 条件式, 条件式がFalseの場合に出力するメッセージ
上記のようにFalseの場合に出力するメッセージを書くことができますが、PyTestを利用する場合は特に指定しなくても場所を表示てくれるので問題ないです。
def test_raise_error() :
assert 1 + 1 == 3, "1 + 1 != 3"
初期化と完了処理
PyTestでは、fixtureを使って初期化・完了処理を記述することができます。fixtureを使う関数ではusefixtures('name')
と記述します。
import pytest
@pytest.fixture
def f() :
print("\nstart..\n")
yield
print("\nend.\n")
@pytest.mark.usefixtures('f')
def test_addition():
print("test_addition()\n")
assert 1 + 1 == 2
実行すると結果の前後にstart..
, end.
が表示されていることが確認できます。
collected 1 item
test.py::test_addition
start..
test_addition()
PASSED
end.
=============================================================== 1 passed in 0.01s ================================================================
テストデータを変更する
同じテストを異なるデータで実行する
複数のデータセットをテストする場合、@pytest.mark.parametrize
を利用します。
以下のように記述すると、a,b,expected
に、3つの組みを流し込んでテストすることが可能です。
import pytest
@pytest.mark.parametrize("a, b, expected", [(1, 2, 3), (2, 3, 5), (3, 5, 8)])
def test_addition(a, b, expected):
assert a + b == expected
実際の例(サンプル)
フォルダ構成
フォルダ構成とファイル構成は以下となるとします。
.
├── src
│ └── my_module.py
└── tests
└── test_my_module.py
ターゲットとする関数を準備します。ここでは2つの要素を加算するadd
を定義してみます。
def add(a,b : int) -> int :
return a+b
以下はtests
フォルダに置くテストファイルです。
import pytest
from src.my_module import add
@pytest.mark.parametrize("a, b, expected", [(1, 2, 3), (2, 3, 5), (3, 5, 8)])
def test_addition(a, b, expected):
assert add(a, b) == expected
上記を作成したら、ルードディレクトリで以下のコマンドを実行します。
python3 -m pytest tests
テストが実行され結果が表示されます。
このようなフォルダ構成にすることでモジュールとテストを分けて管理できます。
まとめ
PyTestは、シンプルな構文と強力な機能を兼ね備えたPythonテストフレームワークです。本記事では基本的な使い方を紹介しました。この記事を参考に、実際にPyTestを使ってテストコードを記述してみてください。