1. ホーム
  2. python

[解決済み] Python unittest: テストファイルの一部分だけを実行するには?

2023-07-05 23:49:03

質問

私はかなり多くの時間を要するテストを含むテストファイルを持っています(それらはクラスタに計算を送信し、結果を待ちます)。これらはすべて特定のTestCaseクラス内にあります。

これらは時間がかかり、さらに壊れそうにないので、私はテストのこのサブセットが実行されるかどうか選択できるようにしたいと思います (最良の方法はコマンドライン引数、つまり " です)。 ./tests.py --offline "またはそのような何かで)、そうすれば、私はテストの大部分を頻繁に素早く実行し、全体セットは時間があるときにたまに実行することができます。

今のところ、私はただ unittest.main() を使ってテストを開始します。

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

デフォルトの unittest.main() はデフォルトのテストローダーを使用して、main が実行されているモジュールから TestSuite を作成します。

このデフォルトの動作を使用する必要はありません。

例えば、3つの unittest.TestSuite のインスタンスを作成します。

  1. fast"サブセットです。

    fast = TestSuite()
    fast.addTests(TestFastThis)
    fast.addTests(TestFastThat)
    
    
  2. slow"サブセットです。

    slow = TestSuite()
    slow.addTests(TestSlowAnother)
    slow.addTests(TestSlowSomeMore)
    
    
  3. セット全体です。

    alltests = unittest.TestSuite([fast, slow])
    
    

FastとSlowを示すためにTestCaseの名前を調整したことに注意してください。 をサブクラス化することができます。 unittest.TestLoader のサブクラスを作成し、クラス名を解析して複数のローダーを作成することができます。

そして、メインプログラムはコマンドライン引数を optparse または argparse (2.7 または 3.2 以降で利用可能) を使って、実行したいスイート、速い、遅い、またはすべてを選択することができます。

あるいは、信頼できる sys.argv[1] が3つの値のうちの1つであることを信頼し、次のような単純なものを使うこともできます。

if __name__ == "__main__":
    suite = eval(sys.argv[1])  # Be careful with this line!
    unittest.TextTestRunner().run(suite)