Python ユニットテストの発見

Salman Mehmood 2023年10月10日
Python ユニットテストの発見

この記事では、単体テストと、特定のコードに対して単体テストを実行する方法について説明します。 discover コマンドを使用してモジュール名を自動的に認識する方法と、Python で機能しない理由を学習します。

unittest モジュールを使用して、Python の discover コマンドを使用してテスト モジュールを認識する

ソフトウェアの品質を確認するために、ソフトウェアに触れたり、匂いを嗅いだり、感じたりすることはできませんが、テスト ツールを使用してテストすることはできます。 単体テストは、アプリケーションのごく一部をインスタンス化し、他の部分とは別にその動作を検証する方法です。

つまり、コードの小さな部分を取り出して、小さな関数で個別にテストします。 開発のこの部分はスキップされることが多く、ソフトウェアの顧客テストはユーザー エクスペリエンスの低下につながります。

一般的な単体テストには、Arrange、Act、Assert の 3つのフェーズがあります。

配置は、単体テストの実行またはオブジェクトのインスタンス化のための適切な条件を作成します。 Act はそのオブジェクトに何らかの入力またはデータを与え、Assert は出力データが期待どおりかどうかをチェックします。

demo.py という名前の新しいファイルを作成して、コードを書き始めましょう。 2つの数値を加算および減算する 2つの関数を作成します。 これらの関数は、整数または浮動小数のみを引数として受け入れることができます。 それ以外の場合は、TypeError がスローされます。

def Add_TWO_NUM(a, b):
    return a + b


def SUB_TWO_NUM(a, b):
    return a - b

unittest は Python ディストリビューションに組み込まれているため、unittest を使用してテスト用の test_functions.py ファイルを作成します。 インストールするために何もする必要はありません。 ただし、コードに unittest をインポートできます。

この余分な接頭辞 test_ を、ファイル名 functions.py の前に追加しました。 この test_ プレフィックスは、unittest がこれがユニット テスト関数が記述されているファイルであることを認識するのに役立ちます。

ご覧のとおり、最初にモジュール unittest をインポートしてから、テストしたいモジュールから関数をインポートしてから、TesstSomeFunctions というクラスを初期化します。 テスト クラスを作成する必要がある場合は、すべてのテスト関数を作成する前にテスト クラスを作成する必要があります。

テスト中なので、括弧内に unittest.TestCase を指定する必要があります。 ユーザー定義クラスは、unittest.TestCase から派生する必要があります。 関数が unittest によって呼び出される唯一の方法は、テストを実行することです。 これは単体テストの場合であり、このクラスのすべての関数は単一の単体テストになります。

これを Python スクリプトの他の関数として定義し、def キーワードを記述できます。 次に、test_ のようなテスト プレフィックスで名前を開始し、任意の名前を付けることができます。

unittest モジュールはアサーションを提供します。 unittest を使用して、unittest モジュール内のすべてのアセットを表示できます。 または公式ドキュメントのすべての方法。

assertEqual() メソッド を使用して、この関数が 10 を返すかどうかを確認します。 Assertion は、結果が 10 であると予想されるため、関数が目的の結果を返すことをアサートしたいことを示します。

この Add_TWO_NUM() 関数への引数として 4 と 6 を提供します。 assertEqual() メソッドの 2 番目の引数では、等しいかどうかのチェックを提供します。

test_SUB_TWO_NUM() という別の関数もテストします。プロセスは同じですが、この関数では、2つの数値を減算する関数をテストしています。 ここで、ファイルに移動して if __name__=='__main__' という行を書き、コマンド unittest.main() を使用して単体テストを実行する必要があります。

import unittest
from demo import Add_TWO_NUM, SUB_TWO_NUM


class TesstSomeFunctions(unittest.TestCase):
    def test_Add_TWO_NUM(self):
        self.assertEqual(Add_TWO_NUM(4, 6), 10)

    def test_SUB_TWO_NUM(self):
        self.assertEqual(SUB_TWO_NUM(5, 3), 2)


if __name__ == "__main__":
    unittest.main()

2つのテスト ケースの準備ができたので、Python ファイルを実行してみましょう。 ご覧のとおり、0.0 秒で実行された 2つのテストに関する情報が得られました。

これらの 2つのドットは、合格したテストを表します。 テストに合格しなかった場合は、大文字の F が表示されます。

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

テスト モジュールをファイルからモジュールとして実行したくない場合はどうすればよいでしょうか。 端末にコマンドを入力することでそれを行うことができます。

python -m unittest test_functions.py

このコマンドはすべて同じように機能します。

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

詳細情報が必要な場合は、詳細を意味する v - を入力すると、各単体テストの詳細が表示されます。 どのテストが最適かを示します。

python -m unittest -v test_functions.py

出力:

test_Add_TWO_NUM (test_functions.TesstSomeFunctions) ... ok
test_SUB_TWO_NUM (test_functions.TesstSomeFunctions) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.002s

OK

ターミナルから単体テストを実行する 3つ目のオプション discover もあります。 このコマンドは、テストで始まるすべてのモジュールを自動的に検出するため、モジュール名を個別に渡す必要はありません。

そのため、すべてのモジュールに test から始まる名前を付けることが不可欠です。

python -m unittest discover

出力:

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

テスト ファイル名が test で始まらない場合、discover コマンドはそれを通常の Python ファイルまたはモジュールとして認識するため、何も返しません。 unittest モジュールの詳細については、python.org にアクセスしてください。

著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

関連記事 - Python Unit Test