1

現在、会社のビルド スクリプトの単体テストをいくつか実装しています。肥大化を解消し、新しいテストの実装を少し簡単にするために、すべてのテスト クラスをBasicTest、PyUnit の TestCase から継承されたカスタム サブクラスから継承するようにしています。

現在、すべてのテストが利用する 2 つの関数がありますBasicTest: コンストラクター (ただし、将来的には明らかに上書きされる可能性があります) と、runTest()値が渡されない場合にスーパーのコンストラクターが使用するデフォルトのメソッド名であるメソッド (たとえばBasicTest()、テストを作成します)runTest()呼び出されたときにメソッドを実行しBasicTest('Foo')ますが、メソッドを使用しFoo()ます)。

runTest()呼び出された継承オブジェクトから可能なすべてのテストを単純に実行したいと思います。ただし、サブクラスでrunTest()のみ定義されBasicTest、継承されるため、サブクラスのすべてのメソッドをスーパーから動的に呼び出す方法を探しています。これがOOプログラミングのルールに違反していることはわかっていますが、私が見る限り、Pythonはそもそもルールに従うものではありませんでした:)

わかりやすくするために、以下に私の意図を示します。

runTest()サブクラス オブジェクトから呼び出され、そのオブジェクトのメソッドのみを処理したい。SubclassTest()メソッドTestParse()とがあるとしましょうTestExec()。私はそれが欲しい:

sub = SubClassTest() 
sub.runTest() 

とを実行TestParse()しますTestExec()が、メソッドをオーバーライドせずにrunTest()で定義して継承する必要があります。BasicTest

4

2 に答える 2

3

サブクラスのすべての興味深いメソッドをクラスプロパティに収集するメタクラスを作成できます

class TestMetaclass(type):
    def __new__(cls, name, bases, attrs):
        own_tests = [v for k,v in attrs.iteritems() if k.startswith('test')]
        attrs['test_method_list'] = own_tests
        return super(TestMetaclass, cls).__new__(cls, name, bases, attrs)

このメタクラスを基本クラスに設定し、メソッド__metaclass__ を実装しますrunTests

class BaseTest():
    test_method_list = []
    __metaclass__ = TestMetaclass
    def runTests(self):
        for method in self.test_method_list:
            method(self)

この後、このメタクラスを使用してすべてのサブクラスが構築されます

class TestOne(BaseTest):
    def test_foo(self):
        pass

最後に、メソッドを実行している収集されたメソッドを使用できrunTests()ます

TestOne().runTests()
于 2013-06-14T16:03:12.313 に答える
1

サンプル コード: 基本クラスの .py ファイルをモジュールとして読み込み、検査する

import inspect
import imp
imp.load_source((name of class by which to want that module), (path base class name of file).py)
module = __import__((name of class by which to want that module))

inspect.getmembers(module) will give you dict of name, cls

お役に立てれば

于 2013-06-14T14:51:21.080 に答える