プログラミング
記事内に商品プロモーションを含む場合があります

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

Aru

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を利用する場合、テスト関数名やファイル名をわかりやすく命名することが重要です。一般的には以下のルールを守ると良いと思います。

  1. テスト関数名はtest_で始める
  2. ファイル名はtest_または_testを含める
  3. テスト内容が一目でわかる名前にする

アサーション(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を使ってテストコードを記述してみてください。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
ある/Aru
ある/Aru
IT&機械学習エンジニア/ファイナンシャルプランナー(CFP®)
専門分野は並列処理・画像処理・機械学習・ディープラーニング。プログラミング言語はC, C++, Go, Pythonを中心として色々利用。現在は、Kaggle, 競プロなどをしながら悠々自適に活動中
記事URLをコピーしました