0

Python 3.4 では、テスト目的で非常に単純なディスパッチ テーブルを作成できるようにしたいと考えています。アイデアは、キーがテストされる関数の名前の文字列であり、データ項目がテスト関数の名前である辞書を持つことです。

例えば:

myTestList = (
    "myDrawFromTo",
    "myDrawLineDir"
)

myTestDict = {
    "myDrawFromTo": test_myDrawFromTo,
    "myDrawLineDir": test_myDrawLineDir
}

for myTest in myTestList:
    result = myTestDict[myTest]()

アイデアは、関数名のリストをどこかに持っているということです。この例では、それらの名前をテスト関数の名前にマップする辞書を手動で作成します。テスト関数名は、関数名を単純に拡張したものです。関数名のリストから辞書全体を計算したいと思います(ここでは ですmyTestList)。

あるいは、辞書なしで同じことができれば、それもいいでしょう。myTestList のエントリから新しい文字列を作成し、それを使用local()して呼び出しを設定しようとしましたが、うまくいきませんでした。辞書のアイデアはPython 3.x のドキュメントに由来しています。

4

2 に答える 2

2

問題には 2 つの部分があります。

簡単な部分は'text_'、各文字列にプレフィックスを付けるだけです。

tests = {test: 'test_'+test for test in myTestDict}

難しいのは、実際に関数を名前で検索することです。そのようなことは通常は悪い考えですが、多くの場合、それが理にかなっているケース (テストの生成) の 1 つを見つけました。これを行うには、次のように、モジュールのグローバル ディクショナリで検索します。

tests = {test: globals()['test_'+test] for test in myTestList}

テストがモジュールのグローバル スコープ以外の場所にある場合、同じ考え方にバリエーションがあります。たとえば、クラスのすべてのメソッドを作成することをお勧めします。その場合、次のようにします。

tester = TestClass()
tests = {test: getattr(tester, 'test_'+test) for test in myTestList}

(ただし、コードは 内にある可能性が高いため、ではなくTestClassを使用します。)selftester


もちろん、実際にdictが必要ない場合は、理解を明示的なforステートメントに変更できます。

for test in myTestList:
    globals()['test_'+test]()

もう 1 つ: 車輪を再発明する前に、 stdlib に組み込まれている、またはPyPI で利用可能なテスト フレームワークを見たことがありますか?

于 2014-09-12T01:21:23.727 に答える
0

アバーナートの答えは役に立ちそうですが、関数名のリストに対してすべてのテスト関数を呼び出す方法についての元の質問に答えるには:

def test_f():
    print("testing f...")

def test_g():
    print("testing g...")

myTestList = ['f', 'g']

for funcname in myTestList:
    eval('test_' + funcname + '()')
于 2014-09-12T01:32:48.847 に答える