【问题标题】:setUp function being called multiple times in django TestCase在 django TestCase 中多次调用 setUp 函数
【发布时间】:2017-10-04 17:44:19
【问题描述】:

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

我的假设是每个 TestCase 类都会调用一次 setUp 函数。但是当我运行 python manage.py test 命令时,每个测试函数都会调用一次 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

【问题讨论】:

    标签: django django-testing


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      如果你真的需要全班只做一次,请使用setUpClass;但请注意,您不应该在那里设置数据。

      【讨论】:

      • 我应该如何解决我必须测试对数据库进行一些添加/删除的代码的多个逻辑点的用例。我不仅在设置功能中设置数据。我必须测试的逻辑对数据库进行了更改,并且我必须测试是否在数据库中创建了各种预期对象。
      • 对不起,我不明白你的问题。这如何阻止您在每次测试中都这样做?
      【解决方案3】:

      我自己一直对此感到有些沮丧。通常需要完成所有测试都依赖的设置。但是,如果您要修改在该设置期间创建的数据,您可能真的会搞砸自己。如果您绝对确定这是您想要做的,您可以使用以下作为基类而不是标准测试用例。然后,不要使用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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 2019-11-13
        • 2010-12-24
        • 1970-01-01
        相关资源
        最近更新 更多