【问题标题】:unittest.TestCase setUpClass override and inheritanceunittest.TestCase setUpClass 覆盖和继承
【发布时间】:2020-09-01 12:57:49
【问题描述】:

从下面的例子可以看出,我为所有测试定义了一个BaseClass,每个测试用例类都继承了基类。

两个类都需要执行一次初始化,当test_vehicles.py被执行时,我需要确保基类的setUpClass也被调用,不知道如何实现@classmethod所在的位置玩。

# base.py
import unittest

class BaseClass(unittest.TestCase):
   @classmethod
   def setUpClass(cls):
       # initialize stuff 
       cls.app = app

# test_vehicles.py
class VehiclesTestCase(BaseClass):

    @classmethod
    def setUpClass(cls):
        # initialize stuff 
        cls.vehicle_id = '123'

    def test_get_vehicle(self):
       resp = self.app.get(self.vehicle_id)
       self.assertEqual(resp, True)



if __name__ == '__main__':
    unittest.main()

【问题讨论】:

    标签: python python-unittest


    【解决方案1】:

    类似问题Using super with a class method。更多信息你也可以从https://docs.python.org/3/library/functions.html#super获得。

    解决方案:使用超函数并绑定到类

    # test_vehicles.py
    class VehiclesTestCase(BaseClass):
    
        @classmethod
        def setUpClass(cls):
            super(VehiclesTestCase, cls).setUpClass()
            cls.vehicle_id = '123'
    
    
    if __name__ == '__main__':
        unittest.main()
    

    【讨论】:

      【解决方案2】:

      可以使用继承类的setUpClass中的super方法访问BaseClasssetUpClass

      super().setUpClass()
      

      如果您不想在每个子类中调用super,只需在BaseClass 中创建一个抽象方法并在BaseClasssetUpClass 中调用它。 VehiclesTestCase 现在必须实现这个抽象方法:

      class BaseClass(unittest.TestCase):
         @classmethod
         def setUpClass(cls):
             # initialize stuff 
             cls.app = app
      
         @classmethod
         def _setUpChild(cls):
             raise NotImplementedError
      
      
      class VehiclesTestCase(BaseClass):
      
          @classmethod
          def _setUpChild(cls):
              # initialize stuff 
              cls.vehicle_id = '123'
      
          def test_get_vehicle(self):
             resp = self.app.get(self.vehicle_id)
             self.assertEqual(resp, True)
      

      如果BaseClass 不能自行运行,我还建议它不是TestCase。尽管它没有测试,但它总是会出现在您的测试报告中。您可以改为使用多重继承:

      class BaseClass:
         # Stuff
      
      class VehiclesTestCase(BaseClass, unittest.TestCase):
         # Stuff
      

      继承顺序很重要。方法查找是从左到右完成的。这意味着BaseClass.setUpClass 会覆盖TestCasesetUpClass

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-29
        • 2017-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-10
        相关资源
        最近更新 更多