gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:22:29 25 4
gpt4 key购买 nike

或者,“如何设计您的数据库模式以便于进行单元测试?”

顺便说一句,这里有一个与此非常相似的问题:
How to test Models in Django with Foreign Keys

我正在尝试为使用框架 Django 的项目遵循 TDD 方法。我正在创建和测试模型及其功能(保存方法、信号……)
和其他依赖模型的高级功能。

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

如何避免所有这些依赖并使测试更干净?

你们建议在实际测试之前避免所有的样板吗?

最佳实践是什么?

最佳答案

没有用于测试的最佳实践列表,其中有很多对您和您正在从事的特定项目有用的方法。我同意 pyriku 的说法:

You should not design your software basing on how you want to test it



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

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

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

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

在您的情况下,要准备与 FactoryBoy 有关系的对象,您可以尝试覆盖 Factory._prepare() 方法,让我们用这个简单的 django 模型来做:
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(User, blank=True, null=True)

# ...

现在,让我们定义一个简单的 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))

现在,假设我想要或需要我的工厂生成具有 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

希望这会有所帮助,或者至少给了你一盏灯。在这里,我将留下一些与我提到的工具相关的资源链接:

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

mock 者: http://niemeyer.net/mocker

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

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

What are the best practices for testing "different layers" in Django?

关于django - 使用 Django 模型进行单元测试并涉及很多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11874071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com