1

私の限られた Python の知識に基づいて、次のコード スニペットを生成しました。

#import statements skipped
class DTestWrapper(BaseA if inLinux else unittest.TestCase):

    def setUpDTest(self):
        if inLinux:
            super(BaseA , self).setUpTestCase()
        else:
            super(unittest.TestCase, self).setUp()

    def tearDownDTest(self):
        if inLinux:
            super(BaseA ,self).tearDownTestCase()
        else:
            super(unittest.TestCase,self).tearDown()

いくつかの背景:
BaseAテスト出力をテーブルに美しくするために使用されるカスタマイズされたクラスです。メンバー関数setUpTestCasetearDownTestCaseおよび他の多くの関数があります。

やりたいこと:上記のコードに示すように、さまざまなプラットフォームに基づいて、独自のクラスに対してさまざまな関数と関数
を呼び出したいと考えています。Linuxで実行する場合は、機能を使用したいと思います。それ以外の場合は、 python の関数を使用したいと思います。から継承する別のクラスがあり、メソッドをオーバーライドしますが、現在はテスト目的で単に空です。setUptearDownDTestWrapperBaseA setUptearDownunittest.TestCaseDDTestWrappersetUpDTest

質問:
上記のコード スニペットを実行したとき、setUporsetUpTestCaseが呼び出されていないようです (テストはすべて失敗しました。正しく呼び出された場合はそうではありません)。私の質問は:

setUpでさまざまな関数を呼び出すにはどうすればよいDTestWrapperですか? これは可能ですか?

私は学んでいるので、どんなフィードバックでも大歓迎です。ありがとうございました。

4

2 に答える 2

2

super()親の検索に基づいて現在のクラスが必要です。

class DTestWrapper(BaseA if inLinux else unittest.TestCase):
    def setUpDTest(self):
        parent_method = 'setUpTestCase' if inLinux else 'setUp'
        getattr(super(DTestWrapper, self), parent_method)()

    def tearDownDTest(self):
        parent_method = 'tearDownTestCase' if inLinux else 'tearDown'
        getattr(super(DTestWrapper, self), parent_method)()

BaseAメソッド名をメソッドと一致させて、余分なテストunittest.TestCaseを保存したい場合があります。if単純なエイリアスで十分です。BaseA.tearDown = BaseA.tearDownTestCase、 例えば。

super()基本クラスの組み合わせと順序に完全に依存する正しいメソッド解決順序を決定するには、現在のクラスが必要です。代わりに基本クラスの開始をsuper()指定すると、その基本クラスが代わりに親であると想定する必要があるため、その基本クラスのメソッドはスキップされます。

于 2013-07-15T18:17:53.800 に答える