Python ユニットテストのセットアップ

Migel Hewage Nimesha 2024年2月15日
  1. Python unittest セットアップ
  2. まとめ
Python ユニットテストのセットアップ

単体テストでは、特定のコード単位またはモジュールが開発者の期待どおりに動作するかどうかを確認します。 ほとんどの場合、テストするコードの単位は関数です。

同様に、すべての機能をテストできます。 ベスト プラクティスとして、少なくとも開発プロセスでは単体テストを実行する必要があります。

そのため、開発プロセスの初期段階でバグを検出し、時間をかけずに修正できます。 これらのテストをスキップすると、プロジェクトを続行するときにエラーを修正するのが難しくなります。

Python unittest セットアップ

Python は、unittest と呼ばれる単体テスト用の別のフレームワークを提供します。 unittest フレームワークはいくつかの機能を提供します。

この方法を使用して実行するテストは、互いに独立しています。 つまり、テストの成功または失敗は、他のテスト結果には依存しません。

また、setup() および teardown() 関数とテストの自動化も提供します。 setup() 関数を使用すると、各テスト メソッドの前に実行する命令を設定できます。

teardown() 関数は、各テスト メソッドの後に実行される命令を記述します。

unittest は、テスト フィクスチャ、テスト ケース、テスト スイート、テスト ランナーなど、ユニット テストで使用するいくつかの重要な概念を提供します。 この記事では、unittestフレームワークを使用して単体テスト用のsetup()関数を作成する方法について説明します。

テストする関数を作成する

まず、テストする関数をいくつか作成する必要があります。 2つの数値を加算、減算、乗算、除算し、剰余を取得する 4つの関数を作成してみましょう。

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


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


def multiply(a, b):
    return a * b


def divide(a, b):
    return a / b


def remainder(a, b):
    return a % b

print() 関数を使用して上記の関数をテストできますが、数百または数千のコードに関してはあまり実用的ではありません。 それでは、機能をテストするためのモジュールを作成しましょう。

テスト モジュールを作成する

命名規則に従って、テスト モジュールに名前を付ける必要があります。 test_ を名前の最初の部分として使用し、次にモジュールの名前を使用します。

このチュートリアルのテスト モジュールを test_calc.py として作成しましょう。

命名規則:

test_ < name >

次に、unittest フレームワークと numCal モジュールをテスト モジュールにインポートする必要があります。 unittest は標準ライブラリに含まれているので、直接インポートできます。 numCal は、テストする必要があるモジュールです。

import unittest
import numCal

次のステップとして、unittest.TestCase を継承するクラスを作成して、そのクラス内でより多くのテスト機能にアクセスできるようにします。

class TestNumCal(unittest.TestCase):

クラス内で、各関数のメソッドを作成します。 メソッドに名前を付けるときは、命名規則に従ってメソッドに名前を付ける必要があります。

テスト モジュールを実行すると、名前の最初の部分がテストであるため、どのメソッドがテストを表しているかがわかります。 それ以外の場合、テスト メソッドを識別せず、それらをスキップします。

まず、add()関数のテストメソッドを作成しましょう。

def test_add(self):
    self.assertEqual(numCal.add(10, 5), 15)

すべてのメソッドと同様に、selftest_add() メソッドの最初の引数です。 2 行目で assertEqual() メソッドを使用しました。

TestNumCal クラスは unittest.TestCase を継承しているため、利用可能なすべての assert メソッドにアクセスできます。 assertEqual()assertNotEqual()assertTrue()assertFalse()assertIn() などのメソッドは単体テストで使用できますが、他にもたくさんあります。

assertEqual() メソッドは、関数から返される値と期待値が等しいかどうかをチェックします。

次に、テスト モジュールをエディターから直接実行するように設定する必要があります。 そうしないと、テスト モジュールを実行しようとしても実行されません。

そのため、以下のコードを使用できます。

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

コードは次のようになります。

import unittest
import numCal


class TestNumCal(unittest.TestCase):
    def test_add(self):
        self.assertEqual(numCal.add(10, 5), 15)


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

これで、test_calc.py モジュールを実行して add() 関数をテストできます。

出力:

テスト追加機能

ここで、ドットはテストに合格したことを示します。 テストが失敗した場合、F が表示され、エラーが発生した場合、エラー メッセージが表示されます。

以下のドットは、テストされたユニットの数を示しています。

次に、残りの関数をテストするために、さらに 4つのテスト メソッドを作成しましょう。

import unittest
import numCal


class TestNumCal(unittest.TestCase):
    def test_add(self):
        self.assertEqual(numCal.add(10, 5), 15)

    def test_subtract(self):
        self.assertEqual(numCal.subtract(10, 5), 5)

    def test_multiply(self):
        self.assertEqual(numCal.multiply(10, 5), 50)

    def test_divide(self):
        self.assertEqual(numCal.divide(10, 5), 2)

    def test_remainder(self):
        self.assertEqual(numCal.remainder(10, 5), 0)


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

各関数に応じて、テスト メソッド名を変更する必要があります。

出力:

5つのテストを実行

ここで難しいのは、各関数の値を各テスト メソッドに設定する必要があることです。 何百ものテストメソッドがあると問題になります。

値を変更する必要がある場合は、各テスト方法を見直して変更する必要があります。

これを克服するために setup() 関数を構築できます。 このメソッドを使用すると、値を 1 回宣言するだけで済みます。 次に、各メソッドの前に実行します。

setUp() 関数を作成する

def setUp(self):
    print("\nsetUp")
    self.num1 = 10
    self.num2 = 5

setup() 関数を設定した後、関数の引数も変更する必要があります。 まず、test_add メソッドを変更しましょう。

def test_add(self):
    print("Add")
    self.assertEqual(numCal.add(self.num1, self.num2), 15)

上記のように、残りのメソッドに変更を加えることができます。完全なコードは次のようになります。

完全なコード:

import unittest
import numCal


class TestNumCal(unittest.TestCase):
    def setUp(self):
        print("\nsetUp")
        self.num1 = 10
        self.num2 = 5

    def test_add(self):
        print("Add")
        self.assertEqual(numCal.add(self.num1, self.num2), 15)

    def test_subtract(self):
        print("Subtract")
        self.assertEqual(numCal.subtract(self.num1, self.num2), 5)

    def test_multiply(self):
        print("Multiply")
        self.assertEqual(numCal.multiply(self.num1, self.num2), 50)

    def test_divide(self):
        print("Divide")
        self.assertEqual(numCal.divide(self.num1, self.num2), 2)

    def test_remainder(self):
        print("remainder")
        self.assertEqual(numCal.remainder(self.num1, self.num2), 0)


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

出力:

セットアップ関数

出力の 5つのドットは、テストが成功したことと、実行されたテストの数を示しています。 その下には、各テストの前に値が設定されています。 それを識別するために、print() 関数を配置しました。

したがって、テストメソッドが開始される前に、setup() 関数が定義された命令を実行し、それらを使用してテストが行われます。

まとめ

この記事では、単体テストと unittest フレームワークとは何か、そしてテスト モジュールを構築する方法を学びました。 最も重要なことは、setup() 関数を使用して、各テスト メソッドの前に実行する定義済みの命令を設定する方法を学習したことです。

setup() 関数は、実行するテストが多く、引数の値を変更する必要がある場合に便利です。

Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.

関連記事 - Python Unit Test