- Pythonでコードを書いてみた!
- でも、本当にちゃんと動いている…?
このような方に、簡単な単体テスト(ユニットテスト)の方法をご紹介します。
本記事では、Pythonで人気のテストフレームワークpytestを使った方法になります。
よく実務の現場でも使われる手法なので、ぜひ参考にしてみてください。
pytestのセットアップ
まずはpytestをインストールします。
pip install pytest上記ではOSの環境にダイレクトにインストールしています。
実際には仮想環境(venv, poetry, pipenvなど)内でインストールするのがオススメです。
pytestを使った単体テストの流れ
pytestを使った単体テストの流れは、以下の通りです。
- テスト対象のコードを用意する
- 単体テストコードを書く
- テストを実行する
手順を一つずつ解説していきます。
テスト対象のコードを用意する
今回は、calculator.pyという以下の内容のモジュールを用意します。
def add(a, b):
return a + b
def divide(a, b):
return a / b今回はこのモジュールの関数をテストしていきます。
テスト対象はadd関数とdivide関数の二つになりますね。
単体テストコードを書く
同じディレクトリにtest_calculator.pyというファイルを作り、テストを書きましょう。
from calculator import add, divide
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0
def test_divide():
assert divide(10, 2) == 5
assert divide(3, 1) == 3ここでのポイントは2点あります。
ポイント1: 関数名はtest_から始める
関数名にはtest_をつける必要があります。
pytestは、モジュール名の先頭にtest_とあるものをテストモジュールとして認識するためです。
ポイント2: assertで期待値を比較する
最終的な出力が正しいかどうかを判定するため、assertを使います。
assertとして、各関数の期待する値を取得・比較する形になります。
テストを実行する
以下のコマンドでテストを実行します。
pytest
======================================================================================================================================= test session starts ========================================================================================================================================
platform darwin -- Python 3.11.11, pytest-8.3.4, pluggy-1.5.0
rootdir: /Users/username/Projects/pytest_test
plugins: anyio-4.7.0
collected 2 items
test_calculator.py .. [100%]
======================================================================================================================================== 2 passed in 0.01s =========================================================================================================================================.(ドット)はパスしたテストを表しています。
このようにpytestとだけにすると、先頭にtest_とあるモジュールを実行してくれます。
ちなみにもう少し結果を見やすくしたい場合は、pytest -vコマンドを実行します。
➜ pytest_test pytest -v
========================================================================================================================================== test session starts ==========================================================================================================================================
platform darwin -- Python 3.11.11, pytest-8.3.4, pluggy-1.5.0 -- /Users/username/.anyenv/envs/pyenv/versions/3.11.11/bin/python3.11
cachedir: .pytest_cache
rootdir: /Users/username/Projects/pytest_test
plugins: anyio-4.7.0
collected 2 items
test_calculator.py::test_add PASSED [ 50%]
test_calculator.py::test_divide PASSED [100%]
=========================================================================================================================================== 2 passed in 0.00s ===========================================================================================================================================テストを実行するためのちょっとしたテクニック
ZeroDivisionErrorが出ることを確認したい
ゼロ除算をしたときにZeroDivisionErrorが出ることを確認するには以下のように書きます。
import pytest
def test_divide_by_zero():
with pytest.raises(ZeroDivisionError):
divide(5, 0)pytest.raisesを使えば、例外が発生するかどうかもテストできます。
文字数を確認する
文字列の文字数を確認するには、len関数を使います。
def test_len():
text = "hello world!"
assert len(text) == 12ある文字を含むかテストする
次のように、文字列に対してinを使うことで特定の文字列が含まれるかテストできます。
def test_contain():
text = "hello world!"
assert "rld" in textよくあるトラブルと解決法
| 問題 | 解決策 |
|---|---|
| テストが実行されない | 関数名がtest_で始まっているか確認 |
ModuleNotFoundError | テストファイルと対象モジュールの場所に注意(相対パス or パスの追加) |
| 特定のテストだけ実行したい | pytest -k "add"を実行 |
| 結果が見にくい | pytest -vで詳細表示がおすすめ |
| 1件失敗したら終了・警告非表示したい | pytest --maxfail=1 --disable-warnings |
まとめ
pytestを使うことで、簡単にテストを導入することができます。
- 初心者でもすぐに始められる
- 書き方がシンプルで見やすい
- 実務でも使われる定番フレームワーク
「動く」コードではなく「壊れにくい」コードを目指して、今日からぜひpytestを使ってみましょう。

コメント