みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Django TestCase で tearDownClass のエラー

Django で単体テストを作成しているときに,Python の unittest を継承している*1からと思って,クラスの初期化を setUpClass() 関数に記載してました.

class DummyTest(TestCase):
    @classmethod
    def setUpClass(cls):
        ...

setUpTestData()関数を使う

ある時に tearDownClass() で以下のようなエラーが発生するようになりました.

AttributeError: type object '***' has no attribute 'cls_atomics'

Django のドキュメントを読むと,setUpTestData() 関数を使いなさいと記載されていました*2

The class-level atomic block described above allows the creation of initial data at the class level, once for the whole TestCase. This technique allows for faster tests as compared to using setUp().

これに従い修正したところ,エラーは解消されました.

class DummyTest(TestCase):
    @classmethod
    def setUpTestData(cls):
        ...

setUpClass()関数をどうしても使いたい

SimpleTestCase and its subclasses (e.g. TestCase, …) rely on setUpClass() and tearDownClass() to perform some class-wide initialization (e.g. overriding settings). If you need to override those methods, don’t forget to call the super implementation *3

class DummyTest(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        ...

    @classmethod
    def tearDownClass(cls):
        ...
        super().tearDownClass()

super().setUpClass() 関数を呼び出しても解決できるようです.