はじめに
この実験では、組み込みのunittestモジュールを使用してPythonコードの単体テストを書く方法を学びます。まずは簡単な関数から始め、その後、データベースとやり取りするコードを含む、より複雑なコードのテストまで進めます。
前提条件
この実験を始める前に、Pythonプログラミング言語の基本的な理解が必要です。また、Pythonで関数を書くことにも慣れている必要があります。
この実験では、組み込みのunittestモジュールを使用してPythonコードの単体テストを書く方法を学びます。まずは簡単な関数から始め、その後、データベースとやり取りするコードを含む、より複雑なコードのテストまで進めます。
この実験を始める前に、Pythonプログラミング言語の基本的な理解が必要です。また、Pythonで関数を書くことにも慣れている必要があります。
始めるには、テスト用の新しい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コードのテストを書いて、それが期待通りに機能し、開発プロセスの初期段階でバグを捕まえることができます。