今回は、テストの実行方法や、**複数ファイルに分けたテストの構成(整理)**について学んだことをまとめます。
unittestの実行方法(基本)
テストスクリプトを直接実行すれば、unittest.main() が走るようになっているのが基本です。
import unittest
def add(a, b):
return a + b
class TestAdd(unittest.TestCase):
def test_add(self):
self.assertEqual(add(2, 3), 5)
if __name__ == '__main__':
unittest.main()
実行方法
python test_add.py
→ スクリプトが実行され、テスト結果が表示されます。
コマンドラインから unittest を実行する
Python には -m unittest を使ってコマンドラインからテストを実行する方法があります。
これにより、__main__ ブロックがなくてもテストを実行できます。
例:特定のテストファイルを実行
python -m unittest test_add.py
例:ディレクトリ内のすべてのテストを自動で検出して実行
python -m unittest discover
このコマンドは、カレントディレクトリ以下を再帰的に探索し、
**ファイル名が test で始まる .py ファイル(例:test_add.py)**の中からテストを実行します。
このとき使用されるファイル名のパターンは、オプション -p のデフォルト値である test*.py です。
そのため、ファイル名が sample_test.py のように test で始まっていない場合は検出されません。
🔍 デフォルトの動作まとめ:
- 探索開始ディレクトリ:カレントディレクトリ(
-s .)- 対象ファイルパターン:
test*.py(-pオプションのデフォルト値)- サブディレクトリも含めて再帰的に探索される
discover のオプション
python -m unittest discover -s tests -p "test_*.py"
| オプション | 意味 |
|---|---|
-s |
テストを探す開始ディレクトリ |
-p |
ファイル名のパターン指定 |
-p を使うことで、test_*.py や *_test.py のような形式にも柔軟に対応できます。
テストファイルを分割して整理する
テストが複数ある場合は、以下のようにディレクトリで整理するのが一般的です。
project/
├── main.py
└── tests/
├── test_add.py
├── test_subtract.py
└── __init__.py
このようにしておけば、以下のようにしてすべてのテストをまとめて実行できます。
python -m unittest discover -s tests
テストスイートを使って明示的にまとめる
複数のテストクラスを自分で組み合わせて、1つにまとめて実行したいときは「テストスイート(TestSuite)」を使います。
これは必要なテストだけを指定して集める方法で、スクリプト内で順序や内容を明確にコントロールしたいときに便利です。
使用例
import unittest
from test_add import TestAdd
from test_subtract import TestSubtract
def suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestAdd))
suite.addTest(unittest.makeSuite(TestSubtract))
return suite
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite())
解説
| 行 | 説明 |
|---|---|
import unittest |
テスト用のモジュールを読み込む |
from test_add import TestAdd |
test_add.py に定義されたテストクラスをインポート |
from test_subtract import TestSubtract |
同様に別のテストクラスをインポート |
suite = unittest.TestSuite() |
空のテストスイートを作成(= テストの入れ物) |
suite.addTest(unittest.makeSuite(...)) |
指定したテストクラス内の全テストをスイートに追加 |
return suite |
作成したスイートを返す |
unittest.TextTestRunner() |
実行結果をテキスト形式で出力するランナーを作成 |
runner.run(suite()) |
スイートを実行する(関数呼び出しで返された中身を実行) |
ポイント
-
makeSuite(TestClass)は、クラスの中にあるtest_で始まるすべてのテストメソッドを1つのセットにしてくれます。 - 自分で追加するテストクラスを明示できるので、細かい実行制御をしたいときに便利です。
-
TestSuiteを使わずにunittest.main()に任せることもできますが、「何を実行するか」を自分で決めたい場合はこちらの方法が向いています。
このように、テストスイートを使えば自分で実行対象のテストを選びながらまとめて一括実行できるため、規模の大きいテストや条件付き実行に役立ちます。
まとめ
- テストは
python ファイル名.pyでも、-m unittestでも実行できる -
discoverを使えば、再帰的にテストファイルを自動検出して実行できる -
discoverのデフォルトは-s .と-p test*.py - テストが増えてきたら
tests/フォルダで整理すると管理しやすい -
TestSuiteを使えば、必要なテストだけをまとめて実行することもできる