提供自动生成测试数据的工具。
项目描述
此应用程序旨在提供一种简单的方法,将大量随机生成的测试数据加载到您的开发数据库中。您可以使用管理命令通过命令行加载测试数据。
它被命名为 autofixture,因为它基于django的 fixtures。没有 autofixture,您将通过管理界面添加测试数据来查看您的网站上非静态页面的外观。您可以通过使用 dumpdata 导出数据以发送给您的同事或在进行 manage.py reset app 等操作之前保存数据。随着您的网站变得越来越复杂,添加和重新添加数据的过程变得越来越令人厌烦。
这正是autofixtures可以帮助的地方!
要求
我们要求并支持Django 1.4到1.9
安装
您必须在您的python路径上使 autofixture 包可用。您可以将它放入您的项目目录中,或者使用 pip install django-autofixture 从python包索引中安装它。如果您没有pip可用,您还可以使用 easy_install django-autofixture。
要使用管理命令,您必须将 'autofixture' 添加到您的django设置文件中的 INSTALLED_APPS 设置中。如果您只想将 autofixture 包用作库,则无需这样做。
管理命令
loadtestdata 接受以下语法
python manage.py loadtestdata [options] app.Model:# [app.Model:# ...]
几乎是自我解释的。提供模型的名称,以应用程序名称为前缀。之后,放置一个冒号,并告诉命令您想创建多少个对象。以下是一个如何为您的博客应用程序创建三个类别和二十个条目的示例
python manage.py loadtestdata blog.Category:3 blog.Entry:20
哇!您的数据库中已填充了可供使用的测试数据。模型字段通过产生根据字段类型随机生成的值来填充数据。例如,文本字段填充了 lorem ipsum 填充物,日期字段填充了去年的随机日期等。
有几个命令行选项可用。主要是控制相关字段的行 为。如果外键或多对多字段应填充现有数据或如果相关的模型也动态生成。请参阅命令的帮助页面以获取更多信息
python manage.py help loadtestdata
将autofixtures用作unittest工具
测试复杂模型的行为一直困扰着我。有时模型有许多限制或许多依赖它们的对象。一个解决方案是使用从您的生产数据库中导出的传统固定值。但是,在开发过程中,当数据库模式频繁更改时,跟踪更改和每个导出包含的内容可能会很耗时,有时也 很困难。
autofixtures来拯救!
让我们从基础知识开始。我们为 Entry 模型创建一个 AutoFixture 实例,并告诉它创建十个模型实例
>>> from autofixture import AutoFixture >>> fixture = AutoFixture(Entry) >>> entries = fixture.create(10)
以下是为新开发者提供的更多示例。
我有一个 Listing 模型,并希望其中填充10个对象。
>>> from autofixture import AutoFixture >>> fixture = AutoFixture(Listing) >>> entries = fixture.create(10)
在此,我添加了字段值,允许您将字段默认为特定值,而不是由 autofixture 提供的随机条目。
包含 field_values 的通用示例
from <yourapp>.models import <your model> fixture = AutoFixture(<your model>, field_values={'<your field name>':<value>})
特定示例
from main.models import Listing fixture = AutoFixture(Listing, field_values={'needed_players': randint(2,10)}) entries=fixture.create(30)
在上面的示例中,我想要 Session 模型中的 'needed_players' 只包含介于 2 和 10 之间的数字,但如果我想所有 'needed_players' 实例都是 5,我可以将 {'needed_players': 5} 放入其中。
现在您可以对博客条目进行操作和测试。默认情况下,外键和多对多关系的外部依赖项由随机选择的相关模型中已存在的对象进行填充。但是,如果您还没有一个怎么办?您可以提供 generate_fk 属性,该属性允许 autofixture 实例通过生成新的相关模型来跟踪外键
fixture = AutoFixture(Entry, generate_fk=True)
这为 Entry 的所有外键字段生成了新实例。除非模型具有指向自身的外键引用,在这种情况下,如果允许,字段将设置为 None 或引发 CreateInstanceError。这是为了防止最大递归深度错误。可以限制这种行为仅适用于单个字段
fixture = AutoFixture(Entry, generate_fk=['author'])
这只会自动创建新的作者,并不会接触其他表。同样,对于多对多字段也可以做到这一点。但是,您需要另外指定为 m2m 关系创建多少个对象
fixture = AutoFixture(Entry, generate_m2m={'categories': (1,3)})
所有创建的条目模型都会被分配一到三个新类别。
为字段设置自定义值
如上例所示,通常需要特定字段包含特定值。这可以通过 AutoFixture 的 field_values 属性轻松实现
fixture = AutoFixture(Entry, field_values={'pub_date': datetime(2010, 2, 1)})
限制分配给外键字段的模型集
例如,可以将分配给外键字段的用户限制为仅非员工用户。或者为不属于 Yoko Ono 的所有博客创建条目。使用与 ForeignKey.limit_choices_to 属性相同的结构
from autofixture import AutoFixture, generators fixture = AutoFixture(Entry, field_values={ 'blog': generators.InstanceSelector( Blog, limit_choices_to={'name__ne':"Yoko Ono's blog"}) })
自定义autofixtures
为了为您的模型定制自动安装程序,您可以在某个地方轻松地继承AutoFixture(例如,在myapp/autofixtures.py中)。
from models import MyModel from autofixture import generators, register, AutoFixture class MyModelAutoFixture(AutoFixture): field_values = { 'name': generators.StaticGenerator('this_is_my_static_name'), } register(MyModel, MyModelAutoFixture)
然后,loadtestdata将自动使用您的自定义安装程序。
python manage.py loadtestdata app.MyModel:10
您可以自动加载已安装应用的所有autofixtures.py文件,就像您可以使用管理员的自动发现一样。通过在代码中的某个位置运行autofixture.autodiscover()来完成此操作,最好在urls.py中。
更多
还有更多值得探索的内容,这可能对您和您的项目都有用。
有方法可以注册定制的AutoFixture子类,以便在调用模型的loadtestdata时自动使用。
更多相关模型的控制,即使是相关模型的关联关系...(例如,通过使用generate_fk=['author', 'author__user'])
用于确保创建的模型有效的自定义约束(例如,unique和unique_together约束,这些约束默认已处理)
贡献
您可以在github上找到最新的开发版本。去那里分叉它,提交错误报告或给我发送美好的祝愿。
要开始开发,请确保测试套件通过。
virtualenv .env source .env/bin/activate pip install -r requirements/tests.txt python setup.py test
现在去,做一些编码工作。
请随时告诉我关于评论或功能请求。您可以通过邮件或twitter与我联系。
快乐的自动安装程序!
变更日志
0.12.1
0.12.0
0.11.0
0.10.1
修复了对多个None值的唯一约束检查。感谢Andrew Lewisohn提供的补丁。请参阅#66。
0.10.0
在自动导入自动安装程序定义时,支持Django 1.7风格的settings.INSTALLED_APPS应用配置。
添加了autofixture.generators.PositiveDecimalGenerator。
0.9.2
修复了生成超过30个字符的用户名的UserFixture。
0.9.1
修复了具有多个唯一组合设置的模型的唯一约束。
0.9
让ImageGenerator考虑给定的文件存储。感谢Andrew Pashkin提供的补丁。
修复了在数据生成过程中对唯一约束的检查,如果字段允许为空值。感谢Andrew Pashkin的报告和修复。
0.8.0
增加对 django 的 ImageField 的支持。感谢 Visgean Skeloru 提供的补丁。
0.7.0
增加 AutoFixture.pre_process_instance 方法。
允许 AutoFixture.create 方法使用任意关键字参数。
修复 autofixture.unregister 函数。
修复 UserFixture.post_process_instance。
0.6.3
修复了关于 GenericRelation 字段长期存在的问题。感谢 StillNewb 提供的补丁。
0.6.2
支持 Django 1.6。
0.6.1
修复了具有自引用 ForeignKey 字段的模型的问题。感谢 Josh Fyne 提供的补丁。
0.6.0
添加 generators.WeightedGenerator 用于概率性选择值。感谢 Jonathan Tien 提出想法和补丁。
支持模型继承。感谢 Josh Fyne 提供的补丁。
0.5.0
添加 FirstNameGenerator 和 LastNameGenerator。感谢 Jonathan Tien 提供初始补丁。
注册的 Autofixtures 用于创建具有外键和多对多关系的模型。感谢 Theo Spears 提供的报告。
0.4.0
Python 3 支持!虽然我们不得不放弃 Python 2.5 支持。如果您尚未升级到 Python 2.6,请考虑使用 django-autofixture 的 0.3.x 版本。顺便说一句:Python 3 的支持意味着测试套件可以无错误运行。我尚未在 Python 3 的生产环境中测试过库。因此,如果您遇到任何问题,请测试并提交错误报告。
0.3.2
DateTimeField 现在接收带时区的 datetime 对象。感谢 Scott Woodall 提供的报告和补丁。
为 EmailGenerator 添加 static_domain 参数,以便始终生成具有相同域的电子邮件。感谢 mvdwaeter 提供初始补丁。
0.3.1
如果字段分配了默认值,则不会拾取 field_values。感谢 sirex 提供的报告。
0.3.0
通过合并嵌套的 Values 类,更好地支持对 AutoFixture 的子类化。
将属性和参数 none_chance 重命名为更匹配的名称 empty_p 用于生成器,以及 none_p 用于 AutoFixture。
修复了一些关于管理命令选项的问题。感谢 Mikko Hellsing 的辛勤工作。
修复了 unregister() 中的问题。感谢 Mikko Hellsing 提供的报告。
增加对 FloatField 的支持。感谢 Jyr Gaxiola 提供的报告。
0.2.5
修复了管理命令中 --generate-fk 选项的问题。感谢 Mikko Hellsing 提供的报告和修复。
0.2.4
在 Autofixture 子类中使用 Autofixture.Values 定义初始值。
使自动发现更加健壮。如果某些模块无法导入或抛出任何其他异常,则不会中断。
0.2.3
修复了当使用 CharField 时最大长度小于 15 的问题。
AutoFixture.field_values 接受可调用对象作为值。
项目详情
django-autofixture-0.12.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 32588b80814cdff3a8aab7cf3859fc9330d38abe37a9cc16e53d24dd1b1fcd86 |
|
MD5 | 232f8fc5f18081796cfe45c3a40bc159 |
|
BLAKE2b-256 | 294934d6022891fdb26ef42500b748321ef76a05e99ea6d51881c4aeda29275f |