94

私のPythonバージョンは2.6です。

すべてのテストに必要なことを行うので、テストsetUpメソッドを1回だけ実行したいと思います。

私のアイデアは、最初の実行後に「true」に設定されるブール変数を作成し、セットアップメソッドへの複数の呼び出しを無効にすることでした。

class mySelTest(unittest.TestCase):
    setup_done = False

    def setUp(self):
        print str(self.setup_done)
            
        if self.setup_done:
            return
        self.setup_done = True
        print str(self.setup_done)

出力:

False

True

--- Test 1 ---

False

True

--- Test 2 ---

なぜこれが機能しないのですか?私は何かを逃しましたか?

4

8 に答える 8

123

を使用setUpClassして、テスト スイートごとに 1 回だけ実行されるメソッドを定義できます。

于 2013-01-13T17:21:48.747 に答える
73

ダニエルの答えsuper()は正しいですsetUpClass()が、私が見つけたいくつかのよくある間違いを避けるための例を次にTestCase示します。unittest.TestCasedjango.testfalcon.testing

のドキュメントには、そのような場合setUpClass()に呼び出す必要があることは記載されていませんsuper()この関連する質問に見られるように、そうしないとエラーが発生します。

class SomeTest(TestCase):
    def setUp(self):
        self.user1 = UserProfile.objects.create_user(resource=SomeTest.the_resource)

    @classmethod
    def setUpClass(cls):
        """ get_some_resource() is slow, to avoid calling it for each test use setUpClass()
            and store the result as class variable
        """
        super(SomeTest, cls).setUpClass()
        cls.the_resource = get_some_resource()
于 2015-12-03T12:01:04.183 に答える
2

一度設定したいすべてのコードを mySelTest の外に配置します。

setup_done = False

class mySelTest(unittest.TestCase):

    def setUp(self):
        print str(setup_done)

        if setup_done:
            return

        setup_done = True
        print str(setup_done)

もう 1 つの可能性は、 でインスタンス化する Singleton クラスを持つことですsetUp()。これは、コードを 1 回だけ実行__new__し、残りの呼び出しに対してオブジェクト インスタンスを返します。参照:シングルトンを定義するシンプルでエレガントな方法はありますか?

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(
                            cls, *args, **kwargs)
            # PUT YOUR SETUP ONCE CODE HERE!
            cls.setUpBool = True

        return cls._instance

class mySelTest(unittest.TestCase):

    def setUp(self):
        # The first call initializes singleton, ever additional call returns the instantiated reference.
        print(Singleton().setUpBool)

あなたのやり方もうまくいきます。

于 2015-02-19T13:46:57.337 に答える
2

setUp の呼び出しを重複排除しようとしないでください。一度呼び出してください。

例えば:

class MyClass(object):
    ...

def _set_up():
    code to do one-time setup

_set_up()

これは、モジュールが最初にロードされたときに _set_up() を呼び出します。モジュール レベルの関数として定義しましたが、MyClass のクラス メソッドにすることもできます。

于 2013-01-13T18:22:10.460 に答える