\ お問い合わせはこちら! /

【Python】pytestを使った単体テストの方法

  • URLをコピーしました!
  • 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を使ってみましょう。

シェアはこちら
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ミニマリストエッセイスト。
旅や日常の発見を綴り、持ち物へのこだわりを探求。
シンプルに生きる楽しさを発信中。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)