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 にアクセスしてください。
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