使用Django模型进行单元测试并涉及许多关系

jav*_*ier 10 django unit-testing django-models

或者,"如何设计数据库模式以便于单元测试?"

顺便说一下,这里有一个非常类似的问题: 如何用外键测试Django中的模型

我正在尝试使用TDD方法来处理使用Django框架的项目.我正在创建和测试模型及其功能(保存方法,信号......)以及依赖于模型的其他高级功能.

我知道单元测试必须尽可能隔离,但我发现自己使用FactoryBoy为每个测试创建了很多表和关系,因此我的测试不够强大,因为如果模型中的某些内容发生变化,许多测试可能会被破坏.

如何避免所有这些依赖关系并使测试更清洁?

在实际测试之前,你们有什么建议避免所有样板?

什么是最佳做法?

ife*_*inm 13

没有关于测试的最佳实践列表,它有很多适用于您和您正在处理的特定项目的内容.当他说:我同意pyriku:

您不应该根据测试方式来设计软件

但是,我想补充一点,如果你有一个良好的模块化软件设计,它应该很容易正确测试.

我最近在我的工作中进行了一些单元测试,我在Python中发现了一些有趣且有用的工具,FactoryBoy是其中一个工具,而不是在测试的setUp()方法中准备很多对象在类中,您可以为每个模型定义工厂,并在需要时批量生成它们.

你也可以尝试Mocker,它是一个模拟对象的库,因为在Python中一切都是对象,你也可以模拟函数,如果你需要测试一个在一天的特定时间生成X事件的函数,它是很有用的,例如,在上午10:00发送消息,你写了一个datetime.datetime.now()的模拟,它总是返回'10:00am'并该模拟调用该函数.

如果您还需要测试一些前端或者您的测试需要一些人工交互(例如在执行OAuth时),您可以使用Selenium填充和提交这些表单.

在您的情况下,要准备与FactoryBoy关系的对象,您可以尝试覆盖Factory._prepare()方法,让我们使用这个简单的django模型:

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(User, blank=True, null=True)

    # ...
Run Code Online (Sandbox Code Playgroud)

现在,让我们定义一个简单的UserFactory:

class UserFactory(factory.Factory):
    FACTORY_FOR = User

    first_name = 'Foo'
    last_name = factory.Sequence(lambda n: 'Bar%s' % n)
    username = factory.LazzyAttribute(lambda obj: '%s.%s' % (obj.first_name, obj.last_name))
Run Code Online (Sandbox Code Playgroud)

现在,让我们说我想要或者需要我的工厂生成有5个成员的组,GroupFactory应该是这样的

class GroupFactory(factory.Factory):
    FACTORY_FOR = Group

    name = factory.Sequence(lambda n: 'Test Group %s' % n)

    @classmethod
    def _prepare(cls, create, **kwargs):
        group = super(GroupFactory, cls)._prepare(create, **kwargs)
        for _ in range(5):
            group.members.add(UserFactory())
        return group
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助,或至少给你一个亮点.在这里,我将留下一些与我提到的工具相关的资源的链接:

工厂男孩:https://github.com/rbarrois/factory_boy

Mocker:http://niemeyer.net/mocker

Selenium:http://selenium-python.readthedocs.org/en/latest/index.html

关于测试的另一个有用的线程:

在Django中测试"不同层"的最佳实践是什么?