2013-02-18 4 views
6

Pythonプロジェクトのテストスイートをunittestからnoseに変換しています。プロジェクトの既存のフレームワーク(unittestに基づいています)は、テスト発見と実行のための非常にカスタマイズされたコードをたくさん含んでいて、むしろぎこちないので、すべてをより合理化するために鼻に移行しようとしています。Pythonのノーズテストの継承:サブクラスからのユニットテストのフィクスチャ

しかし、テストスイートを生成するコードに問題があります。

プロジェクトのフレームワークには、テストを実行する2つの方法があります。 1つは

class TestSomething(unittest.TestCase): 

    def setUp(self): 
     ... 

    def test_x(self): 
     ... 

    def test_y(self): 
     ... 

suite = unittest.TestSuite() 
suite.addTest(unittest.makeSuite(TestSomething)) 

です。これは「簡単な」方法です。すべてのNoseの例とチュートリアルが示すとおりです。しかし、第二の方法は、異なるセットアップの設定が含まれており、スーパークラスからテストを継承し、さまざまなサブクラスでテストケースを作成し、その後、すべてのテストロジックが含まれているテストクラスを定義することである:

class TestSomething(unittest.TestCase): 

    def test_x(self): 
     ... 

    def test_y(self): 
     ... 

class TestCase1(TestSomething): 

    def setUp(self): 
     ... 

class TestCase2(TestSomething): 

    def setUp(self): 
     ... 

suite = unittest.TestSuite() 

cases = [TestCase1,TestCase2] 
suite.addTests([unittest.makeSuite(case) for case in cases]) 

これは鼻が失敗したものですと。スーパークラスにsetUp()がなく、test_x()およびtest_y()で使用されている変数の多くがまだ定義されていないため、明らかに動作しないテストメソッドを最初に実行しようとします。

これの例はどこにも見つかりませんでした。また、Nose(やや疎遠でナビゲートするのが難しい)ドキュメントにもそのようなことは言えません。どのようにこれを鼻で働かせることができますか?どんな助けでも大歓迎です。

答えて

13

まず、unutbuとして、にはTestで始まる名前を付けるべきではありません。noseは自動的にそのようなクラスをテストケースとして扱うためです。また、noseは、このようにやって、彼が見つけたすべてのTestCaseのサブクラスを実行します:

class Something(unittest.TestCase): 
    ... 

は正確にあなたが持っているのと同じ結果が得られます。これを行うために他の方法は Falseにクラスの __test__属性を設定することです

class Something(object): 
    def test_x(self): 
     # here the various assertEqual etc. do not resolve, but you can use them 
     # as if they were present, since in real test-cases they will be inherited 
     # from unittest.TestCase. 
     ... 
    ... 

class TestCase1(unittest.TestCase, Something): 
    def setUp(self): 
     ... 

:私はあなたがTestCaseから継承し、ミックスインとしてそのクラスを使用してはならないと思うまた

class TestSomething(unittest.TestCase): 
    __test__ = False 
    def test_x(self): 
     ... 


class TestCase1(TestSomething): 
    __test__ = True #must put this 
    def setUp(self): 
     ... 

あなたはテストケースで、どちらがされていないクラスマークするnose.istestnose.nottestを使用することができます。

@tools.nottest 
class TestSomething(unittest.TestCase): 
    def test_x(self): 
     ... 

@tools.istest 
class TestCase1(TestSomething): 
    sef setUp(self): 
     ... 
+0

鼻デコレータを使用してsはトリックをした。今では非常に明白なようですが、時には最も明白な解決策は最も難しいものです...ヒントのために多くの感謝! – Boris

関連する問題