【问题标题】:Django: optimize test that violates DRY [closed]Django:优化违反 DRY 的测试 [关闭]
【发布时间】:2016-07-30 16:59:42
【问题描述】:

正在测试的模型是

class A(models.Model):
    """ model A"""
    name = models.CharField(max_length=50, unique=True)
    slug = AutoSlugField(max_length=265, unique=True, populate_from='name')
    link = models.URLField(blank=True)

    class Meta:
        verbose_name = 'Model A'

    def __unicode__(self):
        return self.name

class B(models.Model):
    """ model B"""
    name = models.CharField(max_length=50, unique=True)
    slug = AutoSlugField(max_length=265, unique=True, populate_from='name')
    link = models.URLField(blank=True)

    class Meta:
        verbose_name = 'Model B'

    def __unicode__(self):
        return self.name

给定模型的简单测试,

class TestA(TestCase):
    """ Test the A model """

    def setUp(self):
        self.name = 'A'
        self.slug = 'a'
        self.object = A.objects.create(name=self.name)

    def test_autoslug_generaton(self):
        """ test automatically generated slug """
        assert self.object.slug == self.slug

    def test_return_correct_name(self):
        """ test the __unicode__() method """
        assert self.object.__unicode__() == self.name

class TestB(TestCase):
    """ Test the A model """

    def setUp(self):
        self.name = 'B'
        self.slug = 'b'
        self.object = B.objects.create(name=self.name)

    def test_autoslug_generaton(self):
        """ test automatically generated slug """
        assert self.object.slug == self.slug

    def test_return_correct_name(self):
        """ test the __unicode__() method """
        assert self.object.__unicode__() == self.name

这里的测试违反了 DRY,因为测试只是更改模型的重复。我如何重构测试,因为它不违反 DRY?

DRY- Dont R重复Y我们自己,一种软件开发理念,旨在减少冗余和代码重复

谢谢。

【问题讨论】:

标签: python django testing dry django-testing


【解决方案1】:

正如@mevius'评论中指出的答案中提到的,多重继承是一种方法。为重复的测试方法创建一个Mixin,在实际测试类中实现setUptearDown即可:

class MixinAB(object):

    def test_autoslug_generaton(self):
        """ test automatically generated slug """
        assert self.object.code == self.slug

    def test_return_correct_name(self):
        """ test the __unicode__() method """
        assert self.object.__unicode__() == self.name


class TestA(MixinAB, TestCase):
    """ Test the A model """

    def setUp(self):
        self.name = 'A'
        self.slug = 'a'
        self.object = A.objects.create(name=self.name)

【讨论】:

  • 测试通过。非常感谢。
【解决方案2】:

建议的重复和 schwobaseggl 的答案解决了您的高级问题,但我认为可能还有另一种方法更适合 DRY。目前,您有两个 99% 相同的模型。我希望其中一些是为了让您的问题集中,但假设您的“真实”模型中有大量重叠,您已经无法不重复自己。我建议考虑重构 A 和 B 以从基本模型继承(参见 https://docs.djangoproject.com/es/1.9/topics/db/models/#abstract-base-classes)。然后,您可以为重构到基础(可以使用 A 或 B 的实例)中的通用功能创建一个测试用例,然后为 A 和 B 的独特部分分离测试用例。

【讨论】:

  • 谢谢。我将重构模型,我从未考虑过从抽象模型中继承模型,因为真实模型看起来并不相同,但我为 .因为@schwobaseggl 回答了这个问题,所以我接受了这个答案,因为这个问题是关于测试的。
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多