Python で単体テストを実行するには?


著者による画像

コードが品質基準を満たし、期待どおりに機能することを確認するには、コードを個別に検証する必要があります。 簡単なレシピで作りながら、いろいろな段階で味見をしながら味を調整していきます。 この概念をコードにまで拡張し、常にコードを調べてその正確性を検証しています。 テストに関しては、手動テストまたは自動テストのいずれかを実行できますが、手動テストは面倒で時間のかかるプロセスです。 自動化されたテストには、人間ではなくスクリプトによるテストの実行が含まれます。 自動テストには、単体テスト、統合テスト、ストレス テストなど、さまざまな種類のテストがありますが、このチュートリアルでは単体テストに焦点を当てます。

単体テストは、個々のユニットのエラーを分析して、コードを安定させ、将来にわたって使用できるようにする手法です。 これらのユニットは、個々の関数、完全なクラス、またはモジュール全体の場合があります。 ほとんどの場合、これらのユニットはコードの他の部分に依存していません。 これらのユニットはアプリケーションの基本的な構成要素であり、それらに欠陥があるとアプリケーションが壊れてしまうため、これは重要です。 また、開発者の生産性を高め、モジュラー プログラミングを促進します。

Python では、次のような多くのテスト ランナーを使用できます。

  • 単体テスト
  • パイテスト
  • 鼻2
  • 証言する
  • DocTest

このチュートリアルでは、Python 標準ライブラリの組み込みテスト フレームワークである unittest を使用します。 テスト フレームワークとテスト ランナーの両方が含まれており、テストの自動化やコレクションへのテストの集約から、レポート フレームワークからのテストの独立性まで、さまざまな機能を提供します。 次の要件があります。

  • 各単体テストは、TestCase クラスを拡張するメソッドとして作成し、メソッドの前にテストを付けて、テスト ランナーにテスト メソッドについて知らせることができます。
  • テスト ケースが成功したか失敗したかを判断する一連の特別なアサーション メソッドを使用します。 最も一般的に使用されるアサーション メソッドの一部を以下に示します。
方法 説明
.assertEqual(a, b) a == b
.assertNotEqual(a, b) a != b
.assertTrue(x) bool(x) は真です
.assertFalse(x) bool(x) は False です
.assertIs(a, b) aはbです
.assertIs(a, b) a は b ではない
.assertIsNone(x) x はなし
.assertIsNotNone(x) x は None ではありません
.assertIn(a,b) a in b
.assertNotIn(a,b) a が b にない
.assertIsInstance(a, b) isinstance(a, b)
.assertNotIsInstance(a, b) インスタンス(a, b)ではない

出典: unittest の公式ドキュメント

  • テストするコードを Python ファイルに次のように記述します。 example.py.
  • 次のようなキーワード test で始まる単体テスト用の新しい Python ファイルを作成します。 test_example.py.
  • インポート ユニットテストモジュール example.py.
  • クラスを拡張するクラスを作成する unittest.TestCase.
  • 次のように test キーワードで始まるテスト メソッドを記述します。 test_functionName(self) assert メソッドを使用して、テスト対象のコードの動作を検証します。
  • コマンドを実行します python -m unittest test_example.py 端末で、またはテストファイルで unittest のメインメソッドを呼び出して実行します python test_example.py

という名前のファイルを作成しましょう calc.py 長方形の面積を計算します。

def calc_rectangle_area(length, width):
    return length * width

テスト ファイルを作成する test_calc.py 次のコードを記述します。

import unittest
import calc

class TestRectangleArea(unittest.TestCase):
    def test_area_calculation(self):
        self.assertEqual(calc.calc_rectangle_area(2, 4), 8, "Incorrect area for a rectangle with length 2 and width 4")
        self.assertEqual(calc.calc_rectangle_area(3, 5), 15, "Incorrect area for a rectangle with length 3 and width 5")
        self.assertEqual(calc.calc_rectangle_area(10, 10), 100, "Incorrect area for a rectangle with length 10 and width 10")

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

走る パイソン test_calc.py あなたの端末で。 次の出力が表示されます。

-----------------------------------------------------------
Ran 1 test in 0.001s

OK

次に、計算用の四角形の式を変更して、テスト ケースを検証します。

def calc_rectangle_area(length, width):
     return length * width * 2

再び実行 python test_calc.py あなたの端末で。

self.assertEqual(calc.calc_rectangle_area(2, 4), 8, "Incorrect area for a rectangle with length 2 and width 4")
AssertionError: 16 != 8: Incorrect area for a rectangle with length 2 and width 4

-----------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)

このコードを拡張して、ゼロ除算などのエラーを処理することもできます。

unittest モジュールは単体テストを作成および実行するための基本的なツール セットを提供しますが、より高度な機能を提供するサードパーティ ライブラリもあります。 それにもかかわらず、単体テストは依然としてソフトウェア開発ライフ サイクルの重要な部分であり、バグを早期に発見するのに役立ち、より信頼性が高く保守しやすいコードを作成できます。 記事をお読みいただければ幸いです。 コメント欄でご意見やご感想をお聞かせください。

カンワル・メーリーン は、データ サイエンスと医療における AI の応用に強い関心を持つ意欲的なソフトウェア開発者です。 Kanwal は、APAC 地域の Google Generation Scholar 2022 に選ばれました。 Kanwal は、流行のトピックに関する記事を書いて技術知識を共有することを好み、技術業界における女性の割合を改善することに情熱を注いでいます。

Leave a Comment

Your email address will not be published. Required fields are marked *