15.4 TestCase的类层次结构

    继承在TestCase类中是有效的。理想情况下,每个TestCase是唯一的。实际上,在用例之间会有公共的功能,可使用以下3种方式来共享TestCase类之间的共同点。

    • 通用的setUp():可能会有一些在多个TestCase中使用的数据,没有必要重复这些数据。如果一个TestCase类中只包含setUp()或tearDown()的定义而没有任何测试方法,这样是合法的,但是它会导致很困惑的日志,因为它没有包含测试。
    • 通用的tearDown():为包含了OS资源的测试创建一个公共的清理函数是常见的。我们可能会希望移除文件和目录或终止子进程。
    • 公共的结果检查函数:对于逻辑复杂的测试,可以使用公共的结果检查方法来对结果中的一些特性进行验证。

    回顾一下第3章“属性访问、特性和修饰符”,例如,RateTimeDistance类。这个类基于两个其他值为一个字典中缺失的值进行了赋值。

    class RateTimeDistance( dict ):
       def init( self, args, **kw ):
         super().init(
    args, *kw )
         self.solve()
       def getattr( self, name ):
         return self.get(name,None)
       def setattr( self, name, value ):
         self[name]= value
         self.solve()
       def __dir
    ( self ):
         return list(self.keys())
       def _solve(self):
         if self.rate is not None and self.time is not None:
           self['distance'] = self.rate
    self.time
         elif self.rate is not None and self.distance is not None:
           self['time'] = self.distance / self.rate
         elif self.time is not None and self.distance is not None:
           self['rate'] = self.distance / self.time

    它的每个单元测试方法会包含以下代码:

    self.assertAlmostEqual( object.distance, object.rate * object.time )

    如果我们使用TestCase的很多子类,可以继承并使用以下这个方法来完成验证:

    def validate( self, object ):
       self.assertAlmostEqual( object.distance, object.rate * object.time
    )

    这样一来,只需在每个测试中包含 self.validate(object)来确认所有的测试都提供了正确性一致的定义。

    单元测试模块中的一个重要定义是测试用例使用了正确的类并且正确地使用了继承。我们可以像定义应用中类那样,谨慎地对TestCase类层次结构的细节进行定义。