在 Django TestCase 中多次调用 setUp 函数

setUp function being called multiple times in django TestCase

我是第一次使用 Django 单元测试。以下是我的代码的缩小版本。

我的假设是每个 TestCase 都会调用一次 setUp 函数 class。但是当我 运行 python manage.py 测试命令时,每个测试函数都会调用一次 setUp 函数。

是我做错了什么还是我的假设有问题?

class SampleTest(TestCase):
    """
        This class assumes an archiver setup with
            add available at localhost:9101
            query available at localhost:9105
    """

    def __init__(self, *args, **kwargs):
        self.init_var = False
        super(SampleTest, self).__init__(*args, **kwargs)

    def setUp(self):
        """"""
        print "setup called"
        self.init_var = True


    def test_1(self):
        print "Test 1", self.init_var

    def test_2(self):
        print "Test 2", self.init_var

是的,你的假设是错误的。测试用例中的每个测试都应该是独立的;所以 setUp (和 tearDown) 为他们每个人调用一次。

如果你真的需要在整个过程中只做一次 class,请使用 setUpClass;但请注意,您不应该在那里做诸如设置数据之类的事情。

这是因为每次调用测试用例时都会调用setUp。如果你只想调用它一次,你必须使用 setUpClass@classmethod 装饰器,如下所示:

class SampleTest(TestCase):

    @classmethod
    def setUpClass(cls):
        super(SampleTest, cls).setUpClass()
        # your code

我自己一直对此感到有些沮丧。通常需要完成所有测试都依赖的设置。但是,如果您要修改在该设置期间创建的数据,您可能真的会把自己搞砸。如果您绝对确定这就是您想要做的,您可以使用以下作为基础 class 而不是标准测试用例。然后,不要使用 setUp 来设置测试,而是根据需要使用 before_running_all_testsbefore_running_each_test

class TestCasePlus(TestCase):
    _one_time_setup_complete = False

    def before_running_all_tests(self):
        pass

    def before_running_each_test(self):
        pass

    def setUp(self):
        if not self._one_time_setup_complete:
            self.before_running_all_tests()
        self.before_running_each_test()