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

Django Testing: How to test similar code

假设我有 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-argument 等的小数字段),而不是实现。

我可以为每个自定义字段类型和每个参数创建单独的测试(这是一个简化的模型,实际上我有很多额外的参数和更多的字段类型)。但我可以创建一个 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. 首先,mixin 正在按预期工作。
  2. 其次,所有三个 类 都继承自那个 mixin。

所以,如果你的 mixin 提供了三个操作,你可以在 mixins 中测试所有三个操作。在经典的 TDD 意义上,您将确保该操作中至少有一个在所有继承的 类.

中工作。