3

次のように、unittest2onを使用して でPython2.5テストを検出しています。unittest.TestLoader.discover

suite = unittest2.loader.TestLoader().discover(test_path)
unittest2.TextTestRunner(verbosity=2,
        resultclass=ColorTestResult).run(suite)

test_path私のプロジェクトのベースにあるものもあります。

他の多くのクラスによって拡張およびオーバーロードされた基本クラスがありますが、これらの派生物に回帰がないことをテストしたいと思います。Aその基本クラスとその派生クラスA1A2、 などと呼びましょう。

unittest2.TestCaseの各派生物に対してオーバーロードできる基本クラスを作成したいと思いますA。つまり、次のような階層が必要です。

class A:
    pass

class A1(A):
    pass

class UT(unittest2.TestCase):
    target = A

class UT2(UT):
    target = A1

ここでの秘訣は、私がA抽象クラスにしていることであり、 などUTに適切に合格するほぼすべてのテストケースで失敗します.UT2

私にとって最も簡単な解決策は、 unittest2 をdiscover何らかの形で「スキップ」することUTです。これは、一致するパターン「test*.py」以外のファイルに入れることで可能になると思いますが、そうではないようです。

上記のシナリオに対する適切な解決策はありますか?

どんな考えや提案にも感謝します。

4

1 に答える 1

2

問題は、UT2 が UT から継承されているため、UT2 が定義されているモジュールが UT をインポートし、モジュールの名前空間で使用できるようになっていることだと思います。したがって、ディスカバリーは UT が定義されているモジュールを調べていなくても、UT2 モジュールで TestCase を見つけることができます。

これは、テストを定義するベース TestCases を持つ一般的な問題です。

いくつかの可能性があります。1 つは関数を介して UT を公開することで、UT2 を含むモジュールは UT ではなく関数を直接インポートします。

class UT2(get_base_class()):
    target = A1

UT の属性には、super() を使用してアクセスできます。

別の、おそらくより良い解決策は、UT をより抽象的にすることです。UT でターゲットを省略し (目的がないように見えるため)、setUp でターゲットがない場合 (またはターゲットが A の場合)、skipTest を呼び出すことができます。

3 つ目の解決策は、UTを TestCase から継承せず、ミックスインとして使用することです。

class UT2(TestCase, UT):
     target = A1
于 2011-06-09T11:04:33.247 に答える