コードのテスト

PythonPythonBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、組み込みのunittestモジュールを使用してPythonコードの単体テストを書く方法を学びます。まずは簡単な関数から始め、その後、データベースとやり取りするコードを含む、より複雑なコードのテストまで進めます。

前提条件

この実験を始める前に、Pythonプログラミング言語の基本的な理解が必要です。また、Pythonで関数を書くことにも慣れている必要があります。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/arguments_return("Arguments and Return Values") python/ModulesandPackagesGroup -.-> python/importing_modules("Importing Modules") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/custom_exceptions("Custom Exceptions") python/FileHandlingGroup -.-> python/file_operations("File Operations") subgraph Lab Skills python/function_definition -.-> lab-247{{"コードのテスト"}} python/arguments_return -.-> lab-247{{"コードのテスト"}} python/importing_modules -.-> lab-247{{"コードのテスト"}} python/catching_exceptions -.-> lab-247{{"コードのテスト"}} python/raising_exceptions -.-> lab-247{{"コードのテスト"}} python/custom_exceptions -.-> lab-247{{"コードのテスト"}} python/file_operations -.-> lab-247{{"コードのテスト"}} end

数値を加算する

セットアップ

始めるには、テスト用の新しいPythonファイルを作成する必要があります。これをtest_my_code.pyと呼びましょう。また、テスト対象のコードを含むモジュールも作成します。これをmy_code.pyと呼びましょう。

単純なテスト

まずは、2つの数値の和を返す簡単な関数から始めましょう。my_code.pyに、2つの引数を受け取り、その和を返すadd_numbersという名前の関数を作成します。

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

次に、test_my_code.pyでこの関数のテストを書きましょう。まず、unittestモジュールとadd_numbers関数をインポートする必要があります。

import unittest
from my_code import add_numbers

次に、unittest.TestCaseから継承するTestAddNumbersという名前のクラスを作成します。

class TestAddNumbers(unittest.TestCase):
    pass

このクラスの中で、add_numbers関数をテストするtest_add_numbersという名前のメソッドを作成します。関数が正しい和を返すことを確認するために、assertEqualメソッドを使用します。

class TestAddNumbers(unittest.TestCase):
    def test_add_numbers(self):
        result = add_numbers(2, 3)
        self.assertEqual(result, 5)

これで、以下のコマンドを使用してテストを実行できます。

python -m unittest test_my_code.py

テストが合格すると、以下のような出力が表示されます。

...
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

**.**は、1つのテストが合格したことを示しています。

例外のテスト

次に、例外を発生させる関数のテストを行いましょう。my_code.pyに、2つの引数を受け取り、その商を返すdivideという名前の関数を作成します。2番目の引数が0の場合、関数はZeroDivisionErrorを発生させる必要があります。

def divide(a, b):
    if b == 0:
        raise ZeroDivisionError('Cannot divide by zero')
    return a / b

次に、test_my_code.pyでこの関数のテストを書きましょう。2番目の引数が0の場合、関数がZeroDivisionErrorを発生させることを確認するために、assertRaisesメソッドを使用します。

class TestDivide(unittest.TestCase):
    def test_divide_by_zero(self):
        with self.assertRaises(ZeroDivisionError):
            divide(1, 0)

これで、再度テストを実行できます。

python -m unittest test_my_code.py

テストが合格すると、以下のような出力が表示されます。

...
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

**..**は、2つのテストが合格したことを示しています。

データベースを使ったテスト

最後に、データベースとやり取りするコードのテストを行いましょう。この例では、SQLiteとsqlite3モジュールを使用します。

my_code.pyに、SQLiteデータベースに新しいテーブルを作成するcreate_tableという名前の関数を作成します。

import sqlite3

def create_table():
    conn = sqlite3.connect('my_database.db')
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, name TEXT)')
    conn.commit()
    conn.close()

このコードでは、2つの列「id」と「name」を持つ新しいSQLiteデータベーステーブル「my_table」を作成します。その後、テスト用のSQLiteデータベースを作成するsetUpメソッドを持つTestCreateTableという名前のテストクラスを定義します。

次に、create_table関数のテストを書きましょう。まず、テスト用の新しいデータベースを作成する必要があります。これは、各テストの前に実行されるセットアップメソッドで行います。

class TestCreateTable(unittest.TestCase):
    def setUp(self):
        self.conn = sqlite3.connect('my_database.db')

    def test_create_table(self):
        create_table()
        c = self.conn.cursor()
        c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='my_table'")
        result = c.fetchone()
        self.assertIsNotNone(result)

setUpメソッドでは、新しいSQLiteデータベースを作成します。

test_create_tableメソッドでは、create_table関数を呼び出し、その後SQLクエリを使用してテーブルが作成されたことを確認します。

これで、再度テストを実行できます。

python -m unittest test_my_code.py

テストが合格すると、以下のような出力が表示されます。

...
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

**...**は、3つのテストが合格したことを示しています。

まとめ

この実験では、unittestモジュールを使用してPythonコードの単体テストを書く方法を学びました。まずは簡単な関数から始め、その後、データベースとやり取りするコードを含む、より複雑なコードのテストまで進めました。この知識を使えば、Pythonコードのテストを書いて、それが期待通りに機能し、開発プロセスの初期段階でバグを捕まえることができます。