2010-11-30 13 views
9

私はいくつかの不変条件を共有し、共通のインターフェースを持ついくつかのクラスを持っています。それらのそれぞれに対して同じテストを自動的に実行したいと思います。異なるクラスに対して同じテストケースを実行するには?

例として、データセットを分割するためのさまざまなアプローチを実装するいくつかのクラスがあるとします。ここでの共通の不変量は、これらのすべてのクラスについて、すべてのパーティションにわたる結合が元のデータセットと等しくなければならないということです。私は現在持っている何

は次のようになります。

class PartitionerInvariantsTests(unittest.TestCase): 
    def setUp(self): 
     self.testDataSet = range(100) # create test-data-set 

    def impl(self, partitioner): 
     self.assertEqual(self.testDataSet, 
         chain.from_iterable(partitioner(self.testDataSet)) 

その後、私は、私はそのクラスのインスタンスをテストしたいクラスごとimplを呼び出す別の関数を追加します。この問題は、複数のテスト関数でこれを行うときに明らかになります。 5つのテスト関数と5つのクラスをテストしたいとします。これは、すべてのテストを呼び出すためにほぼ同じに見える25の関数を作成します。

私が考えていたもう1つのアプローチは、テンプレートをスーパークラスとして実装し、次にテストする各クラスのサブクラスを作成することでした。サブクラスは、クラスをインスタンス化するための関数を提供することができる。その問題は、デフォルトのテストローダーが(使用できない)ベースクラスを有効なテストケースとみなして実行しようとすると失敗するということです。

あなたの提案は何ですか?テストしたい各パーティショナクラスの

class PartitionerInvariantsTests(unittest.TestCase): 
    def test_impl(self): 
     self.assertEqual(self.testDataSet, 
         chain.from_iterable(self.partitioner(self.testDataSet)) 

class PartitionerATests(PartitionerInvariantsTests): 

P.S:私は、Python 2.6

+1

unittestは、unittest.TestCase'を継承しない場合、基本クラスを実行しようとしますか? – nmichaels

+0

@Nathon:あなたが言ったので、まだ試していません。 –

+0

@Nathon、あなたのアイデアを回答として投稿したいのであれば、私はうれしく鉱山を削除します。 – unutbu

答えて

11

あなたが複数使用することができますナトンさんのコメントフォローアップ

、あなたはそれがobjectからのみ継承することによってテストされてから基本クラスを防ぐことができます継承。

class PartitionerInvariantsFixture(object): 
    def setUp(self): 
     self.testDataSet = range(100) # create test-data-set 
     super(PartitionInvariantsFixture, self).setUp() 

    def test_partitioner(self): 
     TestCase.assertEqual(self.testDataSet, 
        chain.from_iterable(self.partitioner(self.testDataSet)) 

class MyClassTests(TestCase, PartitionerInvariantsFixture): 
    partitioner = Partitioner 
+0

チェーンイテレータはリスト(チェーン...)を使用して反復する必要があります – kevpie

+3

セットアップでスーパーを呼び出す必要があるのはなぜですか? – dylam

+0

+1私の顎が落ちる。 SO(同じテストをコアユニットテストの異なるオブジェクトで実行している)には数十もの同様の質問がありますが、これは間違いなく私が見つけた最高の答えです。私はPythonが複数の継承を持っていたことを知りませんでした(または覚えていませんでした)。 –

0

サブクラスPartitionerInvariantsTestsを使用しています。その後、test_implは、継承のおかげで各Partitionerクラスに対して実行されます。

import unittest 

class Test(object): 
    def test_impl(self): 
     print('Hi') 

class TestA(Test,unittest.TestCase): 
    pass 

class TestB(Test,unittest.TestCase): 
    pass 

if __name__ == '__main__': 
    unittest.sys.argv.insert(1,'--verbose') 
    unittest.main(argv = unittest.sys.argv)  

実行test.py利回り

test_impl (__main__.TestA) ... Hi 
ok 
test_impl (__main__.TestB) ... Hi 
ok 

---------------------------------------------------------------------- 
Ran 2 tests in 0.000s 

OK 
+2

はい、ただし、ベースクラスも実行され、失敗します。サブクラスを実行する方法はありますか?ベースクラスを実行する方法はありますか? –

関連する問題