pytest の基本
Python 仮想環境の用意
-
任意のディレクトリに移動
mkdir <新規作成する任意のディレクトリ> cd <作成した任意のディレクトリ>
-
poetry 環境の作成
# pyproject.toml ファイル作成 poetry init # 仮想環境 .venv をカレントディレクトリに作成するよう設定 poetry config virtualenvs.in-project true # 仮想環境 .venv の作成 poetry shell # 仮想環境のアクティベート source .venv/bin/activate
-
pytest のインストール
poetry add pytest
基本的な pytest コードの作成
pytest テストコードは以下のルールに従って作成する。
-
テストコードの .py ファイル名は
test_
接頭辞をつける、もしくは、_test
接尾辞をつける。- 例)
- test_sample.py
- hoge_test.py
- 例)
-
テストコード内のテスト関数の関数名は、
test_
接頭辞をつける。
テストコードの例
-
テスト成功するテストコード
test_pass.pydef test_passing(): assert (1, 2, 3) == (1, 2, 3)
-
テスト失敗するテストコード
test_fail.pydef test_failing(): assert (1, 2, 3) == (3, 2, 1)
-
テストコードとして検出されないコード
test_hoge.py# ファイル名はテスト対象であるが、関数名がテスト対象でないためテストされない def hoge_test(): assert (1, 2, 3) == (1, 2, 3)
pytest の実行
テストコードのあるディレクトリに移動して以下のコマンドを実行する。
<current_dir>
├── README.md
├── poetry.lock
├── pyproject.toml
└── src
├── test_fail.py
├── test_hoge.py
└── test_pass.py
ディレクトリ内のすべての対象テストコードをテスト
pytest
実行結果
以下のように、テスト結果がターミナルに出力されます。
どのテストメソッドのどの処理で失敗したかをすぐに特定できます。
実際にはテストをパスしなかった箇所は赤字で強調してくれるので、直感的で分かりやすいです。
========================================================= test session starts =========================================================
platform darwin -- Python 3.12.6, pytest-8.3.3, pluggy-1.5.0
rootdir: /Users/junpei/A_Python/training_pytest
configfile: pyproject.toml
collected 2 items
src/test_fail.py F [ 50%]
src/test_pass.py . [100%]
============================================================== FAILURES ===============================================================
____________________________________________________________ test_failing _____________________________________________________________
def test_failing():
> assert (1, 2, 3) == (3, 2, 1)
E assert (1, 2, 3) == (3, 2, 1)
E
E At index 0 diff: 1 != 3
E Use -v to get more diff
src/test_fail.py:2: AssertionError
======================================================= short test summary info =======================================================
FAILED src/test_fail.py::test_failing - assert (1, 2, 3) == (3, 2, 1)
===================================================== 1 failed, 1 passed in 0.03s =====================================================
特定のファイルのみテスト
特定のファイルを明示的に指定して、テストすることもできます。
以下のようにテストしたいファイルのパスを指定します。
pytest src/test_pass.py
実行結果
========================================================= test session starts =========================================================
platform darwin -- Python 3.12.6, pytest-8.3.3, pluggy-1.5.0
rootdir: /Users/junpei/A_Python/training_pytest
configfile: pyproject.toml
collected 1 item
src/test_pass.py . [100%]
========================================================== 1 passed in 0.01s ==========================================================
テストをパスしない場合の traceback を非表示
テストをパスしなかった場合に出力される traceback を省略するには、--tb
オプションに no
を指定します。
pytest --tb=no
実行結果
以下のように、テスト結果がどのファイルで成功・失敗したかをシンプルに表示できます。
========================================================= test session starts =========================================================
platform darwin -- Python 3.12.6, pytest-8.3.3, pluggy-1.5.0
rootdir: /Users/junpei/A_Python/training_pytest
configfile: pyproject.toml
collected 2 items
src/test_fail.py F [ 50%]
src/test_pass.py . [100%]
======================================================= short test summary info =======================================================
FAILED src/test_fail.py::test_failing - assert (1, 2, 3) == (3, 2, 1)
===================================================== 1 failed, 1 passed in 0.02s =====================================================
テスト実行に関する詳細情報を出力
詳細情報を出力するには、-v
(もしくは --verbose
非省略)オプションを使用します。
pytest -v
実行結果
========================================================= test session starts =========================================================
platform darwin -- Python 3.12.6, pytest-8.3.3, pluggy-1.5.0 -- /Users/junpei/A_Python/training_pytest/.venv/bin/python
cachedir: .pytest_cache
rootdir: /Users/junpei/A_Python/training_pytest
configfile: pyproject.toml
collected 2 items
src/test_fail.py::test_failing FAILED [ 50%]
src/test_pass.py::test_passing PASSED [100%]
============================================================== FAILURES ===============================================================
____________________________________________________________ test_failing _____________________________________________________________
def test_failing():
> assert (1, 2, 3) == (3, 2, 1)
E AssertionError: assert (1, 2, 3) == (3, 2, 1)
E
E At index 0 diff: 1 != 3
E
E Full diff:
E (
E + 1,
E + 2,...
E
E ...Full output truncated (4 lines hidden), use '-vv' to show
src/test_fail.py:2: AssertionError
======================================================= short test summary info =======================================================
FAILED src/test_fail.py::test_failing - AssertionError: assert (1, 2, 3) == (3, 2, 1)
===================================================== 1 failed, 1 passed in 0.03s =====================================================