コードのテストは、ソフトウェア開発ライフサイクルの重要な部分であり、アプリケーションを本番環境にデプロイする前に必ず行う必要があります。テストは、コード内のバグを追跡して見つけるのに役立つため、非常に重要です。 テストは、コードを本番環境に出荷する前に、ソース コードの個々のユニットをチェックして最適に動作することを確認する方法です。単体テスト中は、ユーザーのためにソース ファイルを本番環境にデプロイする必要がないことに注意してください。 テストは Python に固有のものではないことも覚えておいてください。 この記事では、Python 単体テストを使用して基本的なテストを作成し、テスト中にコードが成功するか失敗するかを確認する方法を説明します。 前提条件 このチュートリアルを完了するには、次のものが必要です。 Python コードの記述に関する知識 のインストール ローカル マシンで Python プログラム 任意のコード エディター 入門 書き込みテストは、プログラマーがコードベースをテストするために作成する論理プログラムです。開発中、QA は、製品をユーザーに出荷する前に、アプリの改善が必要な点を強調するプロセスを理解する必要があります。この目的のために、2 つの数値を合計して結果を返す関数を作成しましょう。 まず、このチュートリアルでテストを作成するためのすべてのファイルを含むフォルダーを作成します。 という名前のファイルを追加して、この新しいフォルダーに関数を書き込みます。 main.py # main.py # Add the sum of two numbers def add_sum(num1, num2): return int(num1) + int(num2) 上記のコード ブロックができたので、ユーザーが入力プロンプトを介して目的の値を入力できるようにする関数を記述して、コードが機能することを確認しましょう。関数 は 2 つの数値をパラメーターとして取り、演算子 記号を使用して値を返し、合計を取得します。別のファイル に、次のコードをコピーして貼り付けます。 add_sum() + result.py # result.py from main import add_sum print("Please enter the two values\n") num1 = int(input("Please enter the first number: \n")) num2 = int(input("Please enter the second number: \n")) total = add_sum(num1, num2) print(f"The sum of the values is {total}") このコード ブロックは次のことを行います。 main.py から をインポートします main.py add_sum() メソッドを使用して、入力プロンプト値を整数に変換しました int 出力を取得するために f-strings (書式設定構文) を使用して合計を出力する値を合計します 単体テストとテスト ケースとは Python には、コードのテストを作成および実行するためのツールを提供する unittest と呼ばれる組み込みの標準ライブラリ モジュールが付属しています。単体テストの主な目的は、すべてのコード関数が期待どおりに動作するかどうかを確認することです。 テスト ケースは、単体テストを操作する標準的な方法であり、テスト名クラスで機能を利用できます。また、単体テスト用のコンポーネントコードにはテストケースが必須です。さまざまな assert メソッドを使用して、コードの実行直後にエラーをチェックして報告します。 テストに合格する このセクションでは、一連のテストを作成します。 関数のすべてのテスト ケースを記述するためのテスト ファイルを作成する前に、 を更新しましょう。次のコードをコピーして貼り付けます。 add_sum() main.py # main.py def add_sum(num1, num2): try: return int(num1) + int(num2) except ValueError as err: return err コード ブロックは、コード内の例外を処理する ステートメントを使用して、except ブロックにエラーがある場合に警告します。プログラミングのこの方法は、エラーをキャッチするのに役立ち、エラーが発生した特定の行番号を示します。 try/except 次に、同じディレクトリに test.py という名前のテスト ファイルを作成します。このファイルに、次のコードをコピーして貼り付けます。 # test.py import unittest from main import add_sum class MainTest(unittest.TestCase): def test_do_stuff(self): result = add_sum(5, 10) self.assertEqual(result, 15) if __name__ == '__main__': unittest.main() 上記のコード ブロックに示すように、次の処理が行われます。 テストする unittest と関数をインポートします (main.py から取得します)。 Unittest は、add_sum() 関数のテストを含むクラスを作成することによって機能します。この関数は、unittest が提供するクラス内で unittest.TestCase を継承します。 クラスのインスタンスを表す test_do_stuff() で self キーワードを使用して関数を定義します。 test_do_stuff() テスト メソッド内で、変数を宣言し、異なる値を持つ 2 つの引数を渡します。 最後の行は unittest assert メソッド assertEqual を使用しており、結果変数から渡した引数が、受け取ると予想される結果と一致することを検証します。 最後に、unittest.main() を使用してテスト ファイル全体を実行します。 ** ** test.py が自動的に実行されるため、すべてのメソッドを「test_」で開始することを忘れないでください。 テストを実行するたびに、すべてのチェックが成功し、コンソールに OK メッセージが表示されることが期待されます。これは、成功したことを意味します。 Ran 1 test in 0.000s OK テストに失敗する 開発およびテスト中に、失敗のシナリオが存在する必要があります。これを行うと、すべてのプログラムに脆弱性とバグがあることがわかります。 同じファイル で、コードを変更して以下を貼り付けましょう。 test.py # test.py import unittest from main import add_sum class MainTest(unittest.TestCase): # other test def test_do_stuff2(self): result = add_sum("hulu", 5) self.assertEqual(result, 5) if __name__ == '__main__': unittest.main() このコードを実行した結果は次のようになります。 FAIL: test_do_stuff2 (__main__.MainTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "test.py", line 11, in test_do_stuff3 self.assertEqual(result, 5) AssertionError: ValueError("invalid literal for int() with base 10: 'hulu'") != 5 上記の出力から、エラー コードを読み取り、それに応じてコードを修正することで、次の問題を解決できます。 特定の行番号でエラーが発生したため、行番号を確認して解決するように指示されています。 次はアサーション エラーです。これは、文字列 'hulu' が有効なリテラルではないことを示す値エラーを示し、main.py ファイルで 2 つの値が int 型であることを認識しています。 このステップでは、コードを成功させるために渡す正しい値でコードがテストを正常に実行できるようにするために何を修正すればよいかがわかります。 コードの実行 多くのファイルとさまざまなモジュールが作成されており、デフォルトで単一のファイルを試すのではなく、それらすべてを同時にテストする必要がある場合、このコマンドを使用してすべてのテストを同時に実行できます。 python3 -m unittest また、テストの詳細を取得するには、フラグ (verbose) を指定してコマンドを使用します。これにより、正常なテストと失敗したテストが表示されます。 -v python3 -m unittest -v 結果は次のようになります。 test_do_stuff (test.MainTest) ... ok test_do_stuff2 (test.MainTest) ... ok ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK 結論 単体テストは、ユーザーがアプリを使用する前に、新しい機能がリリースされるたびに、コードの作成と出荷に関与する QA と開発者によって実行される必要があります。定期的または定期的にテストを行うことは、後付けではなく、アプリが機能的かつ効率的に機能することへの信頼を築くべきです。 この記事では、開発においてテストが不可欠である理由と、単体テストを使用してコードの機能をチェックし、運用環境にデプロイする前にユーザーの標準仕様を満たす方法について概要を説明しました。 もっと詳しく知る 単体テストのドキュメント