1

次のように、二重継承を持つpython unitestスクリプトがありTestCaseます。

import unittest
class Upper(unittest.TestCase):
    def test_dummy(self):
        pass

class Lower(Upper):
    pass

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

アイデアは、テストメソッドの実装で上位クラスを定義し、いくつかの追加のセットアップ機能を含むこのクラス (異なるサブディレクトリ内) から派生させることです。結局、upper.py多くの異なるtest_lower.pyものが派生するものがあります。テスト メソッドは でのみ実装されupper.pyます。

上記の例を考えると、 python test_example.pyPython が 2 つのテストを実行しようとしていることがわかります。スクリプトには 1 つのテストしか含まれていないのに、なぜ unittest は 2 つのテストを実行するのでしょうか?

unittest は何らかの形でLower1 つのテストと 1 つのテストを見つけると仮定しますが、 (追加の必要なセットアップ機能のため) でUpper見つかったテストのみを実行したいと思います。Lowerどうすればこれを達成できますか?

コンテキスト実際のケースでは、2 つのクラスが 2 つの異なるファイルで定義され、2 つのディレクトリに存在します。たぶんこれが役立ちます。

4

1 に答える 1

0

Unittest ライブラリは、TestCase サブクラスの属性を繰り返し処理し、 で始まるメソッドを見つけますtest_。テストケースのLower場合、親からメソッドを継承するため、Upperテスト ケース内で 1 回、Lowerクラス内で 2 回の 2 回実行されます。test_dummy両方のテストケースを実行することを意図している場合、私が見る唯一の解決策は、他のサブクラスにテストを取り出すことですUpper

親クラスでテストを実行したいが、そのサブクラスのいくつかでスキップしたい場合は、これを試してください:

import unittest
class Upper(unittest.TestCase):
    def test_dummy(self):
        pass

class Lower(Upper):
    def test_dummy(self):
        return  # skip test

    @unittest.skip  # or this - but ugly
    def test_dummy(self):
        return  # skip test

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

アップデート:

私は今、あなたが何を望んでいるかを理解していると思います.テストメソッドをサブクラスでのみ実行したい. 次に、 とサブクラスを継承することをお勧めします -Upperとの両方:objectUpperTestCase

import unittest

class Upper(object):

    def test_dummy(self):
        self.assertTrue(True)

class Lower(unittest.TestCase, Upper):

    pass

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

ランニング:

python test2.py -v
test_dummy (__main__.Lower) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
于 2013-03-20T14:15:48.673 に答える