7

Pythonプロジェクトのテストスイートをunittestからnoseに変換しています。プロジェクトの既存のフレームワーク(unittestに基づく)はかなり不格好で、テストの検出と実行のために大幅にカスタマイズされたコードがたくさん含まれているため、すべてをより合理化するためにnoseに移行しようとしています。

ただし、テストスイートを生成するコードで問題が発生しています。

プロジェクトのフレームワークには、テストを実行する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の例とチュートリアルが示すものであり、機能します。ただし、2番目の方法は、すべてのテストロジックを含むテストクラスを定義し、さまざまなセットアップ構成を含むさまざまなサブクラスでテストケースを作成し、スーパークラスからテストを継承することです。

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()で使用される変数の多くがまだ定義されていないため、明らかに機能しません。

私はこれがどこでも行われた例を見つけていません、そしてノーズの(かなりまばらでナビゲートするのが難しい)ドキュメントもそれについて言及していないようです。どうすればこれを鼻で機能させることができますか?どんな助けでも大歓迎です。

4

1 に答える 1

15

まず第一に、unutbu が指摘したようにTestSomething、 で始まる名前を付けるべきではありません。そのようなクラスは自動的にテストケースとして扱われるTestからです。noseまた、見つけたnoseすべてのサブクラスを実行して、次のようにします。TestCase

class Something(unittest.TestCase):
    ...

あなたが持っているのとまったく同じ結果が得られます。TestCaseそのクラスを継承してミックスインとして使用するべきではないと思います:

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):
        ...

これを行う別の方法は、クラスの__test__属性をFalse次のように設定することです。

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


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

nose.istestまたは、 andを使用しnose.nottestて、どのクラスがテストケースで、どのクラスがそうでないかをマークすることもできます。

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

@tools.istest
class TestCase1(TestSomething):
    sef setUp(self):
        ...
于 2013-02-18T06:52:02.873 に答える