Posted at

あるディレクトリ以下の unittest を全部実行させる

More than 3 years have passed since last update.

Python の unittest モジュールを用いた単体テストを複数のファイルに分けて書いていて、それらを全部実行したいとき、TestLoader.discovery() を使えばできる。

discover(self, start_dir, pattern='test*.py', top_level_dir=None)

デフォルトのパターンだと、start_dir で指定したディレクトリ以下の test で始まり .py で終わるファイルたちを見つけてくる。

次のスクリプトに引数としてディレクトリを与えると、見つけたテストを全部実行する。


runner.py

#!/usr/bin/env python

import sys
from unittest import TestLoader
from unittest import TextTestRunner

def main(path):
loader = TestLoader()
test = loader.discover(path)
runner = TextTestRunner()
runner.run(test)

if __name__ == '__main__':
if len(sys.argv) != 2:
print('usage: %s path' % sys.argv[0])
sys.exit(1)
main(sys.argv[1])


例えば

% find tests -type f -name \*.py

tests/hoge/__init__.py
tests/hoge/test_hoge.py
tests/test_fuga.py

というディレクトリ構成だとする。__init__.py を配置しているのはサブディレクトリからも探してもらうため。スクリプトを実行してみると以下のようになる。

% ./runner.py tests

FF
======================================================================
FAIL: test_1 (hoge.test_hoge.TestHoge)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/python-study/unittest/tests/hoge/test_hoge.py", line 6, in test_1
self.assertEqual(0, 1)
AssertionError: 0 != 1

======================================================================
FAIL: test_1 (test_fuga.TestFuga)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/python-study/unittest/tests/test_fuga.py", line 6, in test_1
self.assertEqual(0, 1)
AssertionError: 0 != 1

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

FAILED (failures=2)

unittest.main に頼るなら以下のような shell script でも同じことができる。


runner.sh

#!/bin/sh

python -m unittest discover $1