- 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/karo/.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
を使ってみましょう。
コメント