unittest.TestCaseの__init__


122

unittest.TestCase初期化時にクラスが実行する処理にいくつか追加したいのですが、それを行う方法がわかりません。

今私はこれをやっています:

#filename test.py

class TestingClass(unittest.TestCase):

    def __init__(self):
        self.gen_stubs()

    def gen_stubs(self):
        # Create a couple of tempfiles/dirs etc etc.
        self.tempdir = tempfile.mkdtemp()
        # more stuff here

この一連のテスト全体で、すべてのスタブが1回だけ生成されるようにしたいと思います。私はsetUpClass()Python 2.4を使用しているので使用できません(Python 2.7でも機能していません)。

ここで何が悪いのですか?

私はこのエラーを受け取ります:

 `TypeError: __init__() takes 1 argument (2 given)` 

... __init__コマンドを使用してすべてのスタブコードを実行すると、その他のエラーが発生しpython -m unittest -v testます。


@Neeraj私の質問はそれより前の質問だと思いますか?
2014年

@Abhijeetこの質問は2013年に質問されたもので、リンク先の質問は2016年に質問されたもので、回答や談話の数が少ないため、代わりに他の質問を重複としてマークする必要がありますか?その答えは、Python関連の3とPython 2については、この質問の話がある
ffledgling

すみません。
Abhijeet 2017

回答:


166

これを試して:

class TestingClass(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(TestingClass, self).__init__(*args, **kwargs)
        self.gen_stubs()

あなたはオーバーライドされているTestCaseのを__init__あなたは、基本クラスがあなたの引数を処理できるようにしたいかもしれませんので、。


+1ただし、オブジェクトメソッドを呼び出す前に基本クラスを初期化します。
Joachim Isaksson 2013年

これではうまくいきません。gen_stub内のものは実行されていません。実際には、gen_stubがまったく呼び出されていないようです...存在するはずのself.tempdirがクラスの他のメソッドからアクセスできないため、わかります。AttributeError: 'TestingClass'オブジェクトに属性 'tempdir'がありません
'27年

22
setUpオーバーライドするのではなく、これを呼び出す必要はありません__init__か?
karthikr 2013年

2
@karthikrすべてのテストで毎回スタブを再作成するのではなく、すべてのテストで一度スタブを生成したい。一部のスタブは、一部のテストでは使用されません。私はsetUpClassを使用しますが、Python 2.4ではサポートされていないと思います。
初出の2013年

2
この場合、もう少し明示的にすることもでき(これは私の意見では読みやすくなります)、unittest.TestCase.__init__(self,*args,**kwargs)代わりにsuper(TestingClass, self).__init__(*args, **kwargs)
Onyooo

22

の初期化関数のオーバーライドに関する説明を追加したかっただけです

unittest.TestCase

関数は、テストクラスの各メソッドの前に呼び出されます。すべてのテストメソッドを実行する前に一度実行する必要のある高価な計算を追加する場合は、SetUpClassクラスメソッドを使用してください

@classmethod
def setUpClass(cls):
    cls.attribute1 = some_expensive_computation()

この関数は、クラスのすべてのテストメソッドの前に一度呼び出されます。setUp各テストメソッドの前に呼び出されるメソッドについては、を参照してください。


4

unittest2をインストールし、そのパッケージのunittestを使用します。

import unittest2 

次に、setupModule / tearDownModuleまたはsetupClass / tearDownクラスを使用して、特別な初期化ロジックを実行します。

詳細:http : //www.voidspace.org.uk/python/articles/unittest2.shtml

また、おそらくユニットテストよりも統合テストを作成しているでしょう。テストを区別するために適切な名前を選択するか、別のコンテナーモジュールに配置します。


ドキュメントのリンクをありがとう。
Chris
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.