9

次のようなテスト スイートがあるとします。

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
4

4 に答える 4

4

鼻の場合、両方のテストを配置し、属性プラグインを使用してどちらを実行するかを選択できます。これは、実行するテストを選択するのに最適です。両方のテストを保持し、それらに属性を割り当てます。

from nose.plugins.attrib import attr

@attr("safe")
class SafeTests(unittest.TestCase):
    # snip 20 test functions

class BombTests(unittest.TestCase):
    # snip 10 different test cases

本番コードの場合は、OS 本番テスト環境でnosetests -a safe、または設定を使用して鼻をNOSE_ATTR=safe呼び出すか、nose オブジェクトで run メソッドを呼び出して、に-a基づくコマンド ライン オプションを使用して Python でネイティブに実行しますTARGET

import sys
import nose

if __name__ == '__main__':
    module_name = sys.modules[__name__].__file__
    argv = [sys.argv[0], module_name]
    if TARGET == 'prod':
        argv.append('-a slow')

    result = nose.run(argv=argv)

最後に、何らかの理由でテストが検出されない場合は、@istest属性 ( from nose.tools import istest)を使用してテストとして明示的にマークできます。

于 2013-10-23T04:34:51.200 に答える
0

あなたの質問が「どうすれば pytest でテストを '見る' ことができるか?」という場合は、各テスト ファイルと各テスト ケース (つまり関数) の前に 'test_' を追加する必要があります。次に、pytest コマンド ラインで検索するディレクトリを渡すだけで、'test_XXX.py' に一致するファイルを再帰的に検索し、それらから 'test_XXX' 関数を収集して実行します。

ドキュメントに関しては、ここから始めてみることができます。

デフォルトの pytest テスト コレクション メソッドが気に入らない場合は、こちらの指示に従ってカスタマイズできます。

于 2013-10-22T16:29:30.610 に答える