没有用于测试的最佳实践列表,其中有很多对您和您正在从事的特定项目有用的方法。我同意 pyriku 的说法:
你不应该根据你想要的测试方式来设计你的软件
但是,我要补充一点,如果你有一个好的和模块化的软件设计,它应该很容易正确测试。
我最近在我的工作中对单元测试有点兴趣,并且我在 Python 中发现了一些有趣且有用的工具,FactoryBoy就是其中之一,而不是在测试的 setUp() 方法中准备大量对象类,您可以为每个模型定义一个工厂,并在需要时批量生成它们。
你也可以试试Mocker,它是一个模拟对象的库,因为在 Python 中一切都是对象,你也可以模拟函数,如果你需要测试一个在一天中的某个时间生成 X 事件的函数,它会很有用,例如,在上午 10:00 发送一条消息,您编写一个总是返回 '10:00am' 的 datetime.datetime.now() 模拟,并使用该模拟调用该函数。
如果您还需要测试一些前端或者您的测试需要一些人机交互(例如针对 执行 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
嘲笑者: http: //niemeyer.net/mocker
硒:http ://selenium-python.readthedocs.org/en/latest/index.html
还有另一个关于测试的有用线程:
在 Django 中测试“不同层”的最佳实践是什么?