Django测试:如何测试类似的代码

时间:2015-08-03 21:55:40

标签: python django unit-testing testing tdd

让我说我有4个django模型字段我已经以这种方式定制:

# This adds an extra argument 'rs_serial' to the fields that subclass this
#
class RsBaseFieldMixin(models.Field):
    def __init__(self, *args, rs_serial=None, rs_arg2=None,.... ,**kwargs):
    self.rs_serial = rs_serial
    self.rs_arg1 = rs_arg1
    self.rs_arg2 = rs_arg2
    ...
    ...
    super().__init__(*args, **kwargs)

class RsCharField(models.CharField, RsBaseFieldMixin, metaclass=models.SubfieldBase):
    pass

class RsDecimalField(models.DecimalField, RsBaseFieldMixin, metaclass=models.SubfieldBase):
    pass

class RsIntegerField(models.IntegerField, RsBaseFieldMixin, metaclass=models.SubfieldBase):
    pass

class RsBooleanField(models.BooleanField, RsBaseFieldMixin, metaclass=models.SubfieldBase):
    pass

Q1 :我测试4个自定义字段,还是只测试mixin?我的猜测是4个字段,因为我想测试功能(如最终结果:我想要一个带有rs_serial参数的小数字段等),而不是实现。

我可以为每个自定义字段类型和每个参数创建单独的测试(这是一个简化的模型,实际上我有很多额外的参数和更多的字段类型)。但我可以创建一个for循环:

class TestFields(TestCase):

    for ft in ['RsDecimalField','RsCharField','RsBooleanField', andsoon]:

        for arg in ['rs_serial', 'rs_arg2', 'rs_arg3' ... andsoon]:
            ...
            ... [ assertEqual(ft.arg, myexpectedvalue) ]
            ...

Q2 这是一种错误的测试方式吗?如果是,为什么以及应该如何我测试它们?

1 个答案:

答案 0 :(得分:0)

在我看来,你需要测试两件事 -

  1. 首先,mixin按预期工作。
  2. 其次,所有三个类都继承自mixin。
  3. 因此,如果你的mixin提供三个操作,你可以在mixin中测试所有三个操作。在经典的TDD意义上,您将确保至少有一个操作在所有继承的类中工作。