1. ホーム
  2. python

[解決済み] ディレクトリ内のすべてのPythonユニットテストを実行するにはどうすればよいですか?

2022-03-22 09:16:12

質問

私は、Pythonのユニットテストを含むディレクトリを持っています。各ユニットテストモジュールは次のような形式です。 test_*.py . というファイルを作ろうとしています。 all_test.py これは、ご想像のとおり、前述のテストフォームにあるすべてのファイルを実行し、その結果を返すものです。これまで2つの方法を試しましたが、両方とも失敗しました。この2つの方法を紹介しますが、実際にこれを正しく実行する方法を知っている人がいることを望みます。

最初の勇ましい試みとしては、ファイル内のすべてのテスト・モジュールをインポートして、次のように呼び出せばよいのではないかと考えました。 unittest.main() しかし、それは間違いでした。

import glob
import unittest

testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]

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

これはうまくいかなかった、私が得た結果は。

$ python all_test.py 

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

2回目の挑戦では、テストというものをもっと手動でやってみようと思いました。そこで、以下にそれを試してみました。

import glob
import unittest

testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
[__import__(str) for str in module_strings]
suites = [unittest.TestLoader().loadTestsFromName(str) for str in module_strings]
[testSuite.addTest(suite) for suite in suites]
print testSuite 

result = unittest.TestResult()
testSuite.run(result)
print result

#Ok, at this point I have a result
#How do I display it as the normal unit test command line output?
if __name__ == "__main__":
    unittest.main()

これもうまくいきませんでしたが、あと少しというところでしょうか。

$ python all_test.py 
<unittest.TestSuite tests=[<unittest.TestSuite tests=[<unittest.TestSuite tests=[<test_main.TestMain testMethod=test_respondes_to_get>]>]>]>
<unittest.TestResult run=1 errors=0 failures=0>

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

何らかの組曲があるようで、その結果を実行することができます。とだけ書かれているのが少し気になります。 run=1 であるべきであるように思われる。 run=2 しかし、それは進歩です。しかし、どのようにmainに結果を渡して表示すればいいのでしょうか?あるいは、このファイルを実行するだけで、このディレクトリのすべてのユニットテストを実行できるように、基本的にどのように動作させればいいのでしょうか?

どのように解決するのですか?

Python 2.7以降では、新しいコードを書いたり、サードパーティのツールを使ったりする必要はありません。コマンドラインを使った再帰的なテスト実行はビルトインされています。 コマンドラインから再帰的なテスト実行が組み込まれています。 __init__.py を test ディレクトリに置いてください。

python -m unittest discover <test_directory>
# or
python -m unittest discover -s <directory> -p '*_test.py'

で詳細を読むことができます。 パイソン2.7 または パイソン3.x unittestのドキュメントを参照してください。


2021年に向けてのアップデート。

最近のPythonプロジェクトでは、以下のような高度なツールを使用しています。 pytest . 例えば、プルダウン matplotlib または scikit-learn をクリックすると、両者が使っていることがわかります。

7000以上のテストがある場合、これらの新しいツールについて知っておくことは重要です。

  • 合格、スキップ、警告、エラーを要約する、より高度な方法
  • どのように失敗したかを簡単に確認する方法
  • 実行中のパーセントコンプリート
  • 総実行時間
  • テストレポートの作成方法
  • などなど