次のようなテスト スイートがあるとします。
class SafeTests(unittest.TestCase):
# snip 20 test functions
class BombTests(unittest.TestCase):
# snip 10 different test cases
現在、次のことを行っています。
suite = unittest.TestSuite()
loader = unittest.TestLoader()
safetests = loader.loadTestsFromTestCase(SafeTests)
suite.addTests(safetests)
if TARGET != 'prod':
unsafetests = loader.loadTestsFromTestCase(BombTests)
suite.addTests(unsafetests)
unittest.TextTestRunner().run(suite)
私には大きな問題があり、興味深い点が 1 つあります
- 私は鼻またはpy.testを使用したいと思います(どちらでもかまいません)
エントリ ポイントを介してこれらのテスト スイートを公開しているさまざまなアプリケーションが多数あります。
インストールされているすべてのアプリケーションでこれらのカスタム テストを集約できるようにしたいので、巧妙な命名規則を使用することはできません。これらがエントリ ポイントを通じて公開されることは特に気 にしません が、サイト パッケージ内のアプリケーション全体でテストを実行できることには気を配っています。(インポートするだけではなく...すべてのモジュール。)
への現在の依存関係を維持することは気
にしませんunittest.TestCase
。その依存関係を破棄することが実質的な目標です。
編集これは、引数を渡すことに関する@Oleksiyのポイント
nose.run
が実際にいくつかの警告で機能することを確認することです。
動作しないもの:
- 実行したいすべてのファイルを渡す(これは奇妙なものです)
- 実行したいすべてのモジュールを渡します。(これは、何も実行しないか、間違ったことを実行するか、実行するものが多すぎるかのいずれかです。0、1、または多数の興味深いケースでしょうか?)
- ディレクトリの前にモジュールを渡す: ディレクトリが最初に来る必要があります。そうしないと、テストが重複してしまいます。
この脆弱性はばかげています。改善するためのアイデアがある場合は、コメントを歓迎します。または、これを機能させようとする実験で github リポジトリをセットアップし ます。
それはさておき、サイトパッケージにインストールされた複数のプロジェクトをピックアップすることを含め、次の作品:
#!python
import importlib, os, sys
import nose
def runtests():
modnames = []
dirs = set()
for modname in sys.argv[1:]:
modnames.append(modname)
mod = importlib.import_module(modname)
fname = mod.__file__
dirs.add(os.path.dirname(fname))
modnames = list(dirs) + modnames
nose.run(argv=modnames)
if __name__ == '__main__':
runtests()
ファイルに保存すると、次のようruntests.py
に実行すると正しいことが行われます。
runtests.py project.tests otherproject.tests