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
关于测试的另一个有用的线程: