web-dev-qa-db-ja.com

py.testは、コンストラクターが定義されている場合、テストクラスをスキップします

私はpy.test経由で実行されている次のユニットテストコードを持っています。コンストラクターが存在するだけで、py.test -v -sの実行時にクラス全体がスキップされます

0アイテムを収集/ 1スキップ

Py.testのこの動作を誰か説明してもらえますか?

Py.testの動作を理解することに興味があります。コンストラクターは必要ありません。

ありがとう、Zdenek

class TestClassName(object):
    def __init__(self):
       pass

    def setup_method(self, method):
       print "setup_method called"

    def teardown_method(self, method):
       print "teardown_method called"

    def test_a(self):
       print "test_a called"
       assert 1 == 1

    def test_b(self):
       print "test_b called"
       assert 1 == 1
42
Zdenek Maxa

Matti Lyraの回答で既に述べたように、py.testはコンストラクターを持つクラスを意図的にスキップします。これは、クラスがpy.testの構造上の理由でのみ使用され、固有の動作を持たないためです。実際にコードを記述するときは、反対に.__init__()メソッドを持たないことクラス。そのため、実際にはコンストラクタでクラスをスキップするのが望ましいと思われます。通常、クラスの名前が競合することがあります。

最後に、py.testはテストを実行するためにクラスをインスタンス化する必要があります。コンストラクターが引数をとる場合、コンストラクターをインスタンス化できないため、再度スキップするのが正しいことです。

37
flub

Py.testのドキュメント says py.testは次の標準テスト検出を実装します。

  • コレクションは、ディレクトリ、ファイル名、またはテストIDの初期コマンドライン引数から始まります。 norecursedirsと一致しない限り、ディレクトリに再帰します
  • パッケージ名でインポートされたtest _ *。pyまたは* _test.pyファイル。
  • Testプレフィックス付きテストクラス(__init__メソッドなし)[<-ここにあることに注意してください]
  • test_プレフィックス付きテスト関数またはメソッドはテスト項目です

そのため、コンストラクターが不要というわけではありません。py.testは、コンストラクターhaveを持つクラスを無視するだけです。標準テスト検出を変更するための ガイド もあります。

36
Matti Lyra