49

次のような単体テストコードがあります。

import unittest

class MyUnitTest(unittest.TestCase):
    def setUpClass(self):
        do_something_expensive_for_all_sets_of_tests()

class MyFirstSetOfTests(MyUnitTest):
    def setUpClass(self):
        super(MyFirstSetOfTests, self).setUpClass()
        do_something_expensive_for_just_these_first_tests()

    def test_one(self):
        ...

    def test_two(self):
        ...

class MySecondSetOfTests(MyUnitTest):
    def setUpClass(self):
        super(MySecondSetOfTests, self).setUpClass()
        do_something_expensive_for_just_these_second_tests()

    def test_one(self):
        ...

    def test_two(self):
        ...

if __name__ == '__main__':
    unittest.main()

このコードを実行しようとすると、次のようなエラーが発生します。

======================================================================
ERROR: setUpClass (__main__.MyFirstSetOfTests)
----------------------------------------------------------------------
TypeError: unbound method setUpClass() must be called with MyFirstSetOfTests instance as first argument (got nothing instead)

----------------------------------------------------------------------
4

1 に答える 1

79

setUpClass クラスメソッドでなければなりません。ドキュメントから:

個々のクラスの実行でテストの前に呼び出されるクラス メソッド。setUpClassクラスを唯一の引数として呼び出され、次のように装飾する必要がありますclassmethod()

@classmethod
def setUpClass(cls):
    ...

詳細については、クラスとモジュールのフィクスチャを参照してください。

あなたのバージョンには@classmethodデコレータがありません:

class MyUnitTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        do_something_expensive_for_all_sets_of_tests()

class MyFirstSetOfTests(MyUnitTest):
    @classmethod
    def setUpClass(cls):
        super(MyFirstSetOfTests, cls).setUpClass()
        do_something_expensive_for_just_these_first_tests()

がインスタンスではなくクラスMyFirstSetOfTests.setUpClass()で呼び出されたため、エラーがスローされますが、メソッドを としてマークしなかったため、自動引数で渡されませんでした。代わりに使用した上記の更新されたコードでは、名前がクラス オブジェクトを参照していることを反映しています。classmethodselfcls

于 2012-12-26T18:27:25.930 に答える