Mongo动态夹具
mongo-dynamic-fixture的Python项目详细描述
动机
- 使用静态json fixture可能会很痛苦,因为如果数据发生变化,它们很难维护
- 添加新的测试通常需要添加新的静态json fixture
- 如果在多个测试用例中使用了静态json fixture,即使稍加更改也会破坏所有测试用例
灵感
这个图书馆的灵感来自django-dynamic-fixture。
基本用法
基本函数是N和G,分别代表new和get。 首先,必须定义要生成的数据的架构:
from mongo_dynamic_fixture.schema import BaseSchema from mongo_dynamic_fixture.fields import IntegerField from mongo_dynamic_fixture.fields import DoubleField from mongo_dynamic_fixture.fields import BooleanField from mongo_dynamic_fixture.fields import StringField from mongo_dynamic_fixture.fields import ArrayField class SiteSchema(BaseSchema): schema = { 'name': StringField(), 'aliases': ArrayField(StringField()), 'active': BooleanField(), 'stats': { 'last_day_visits': IntegerField(), 'average_daily_visits': DoubleField() } }
之后你就可以生成你的装置了!
In [1]: from mongo_dynamic_fixture import N In [2]: N(SiteSchema) Out[2]: {'active': True, 'aliases': ['kisxcp', 'lG', 'vH5', 'Q7oT1xi', 'RyooxkzB', 'FSFnP'], 'name': 'oCmy0ZsGS', 'stats': {'average_daily_visits': 0.02137056342099064, 'last_day_visits': 21}}
函数N将BaseSchema的一个实例作为第一个参数,并生成一个与提供的模式兼容的fixture。 显然,有时我们希望对要生成的fixture有更多的控制权,因此N函数还采用**kwargs可选参数来修复某些特定字段:
In [3]: N(SiteSchema, active=False, stats__last_day_visits=30) Out[3]: {'active': False, 'aliases': ['Euheq6sRgF', '9ajFi', 'xhCiZfxSsZ', 'wf', 'k9pkIXS', 'kX10H5j4', 'ZH', '142uYHlJvD'], 'name': 'KEKasgW', 'stats': {'average_daily_visits': 0.44985850259520865, 'last_day_visits': 30}}
如您所见,active和last_day_visits都已设置为所提供的值。如果要修复的键位于对象的顶层,则只需使用变量名,否则使用_将其所有祖先与stats__last_day_visits分隔,列出它们。如果生成的**kwargs键不是有效的python变量名,则将其传递到extra参数中:
In [3]: N(MySchema, field1=False, extra={'field2__some-invalid-name!': 30})
G函数的作用与N函数的作用相同,但它还将pymongo到Mongo集合的连接作为第一个参数:
In [4]: G(conn['test-db']['test-coll'], SiteSchema, active=False, stats__last_day_visits=30) Out[4]: {'active': False, 'aliases': ['K8ae2uwdW', '8P1lkRBC6', 'NUoyht', 'YG', 'BS9iV6Yy', 'gHgRVCq'], 'name': 'ihccMMs', 'stats': {'average_daily_visits': 0.5553574439909581, 'last_day_visits': 30}}
我们刚刚创建了一个fixture并将其插入到数据库“test db”的集合“test coll”中。
所有可从mongo_dynamic_fixture.fields导入的可用字段如下:
- IntegerField
- DoubleField
- BooleanField
- StringField
- ArrayField
- ObjectField
比基本用法多一点
每个字段都有以下可选参数:
- required(默认值:True)
- null(默认值:False)
- blank(默认值:False)
- not_present_prob(默认值:0)
- null_prob(默认值:0)
- blank_prob(默认值:0)
如果required是False,则按not_present_prob给定的概率,该字段将不在文档中。
如果null是True,则以null_prob给定的概率,该字段的值将为None。
如果blank是True,那么根据blank_prob给定的概率,该字段将有一个空值,该值取决于该字段。
每个字段的空白字段如下:
- IntegerField->;0
- DoubleField->;0.0
- BooleanField->;False
- StringField->;''
- ArrayField->;[]
- ObjectField->;{}
IntegerField和DoubleField也采用min_value和max_value作为可选参数,而StringField和ArrayField也采用min_length和max_length。 IntegerField、DoubleField和StringField还将choices作为可选参数,该参数必须是iterable。如果提供此参数,则生成的值将是iterable中的值之一。 使用StringField还可以通过将字符串的字符集传递给charset可选参数(默认值:string.ascii_letters + string.digits)来指定要生成的字符串字符集。
现在你可能会问“那么ObjectField”的目的是什么?假设您有如下模式:
class SiteSchema(BaseSchema): schema = { 'name': StringField(), 'aliases': ArrayField(StringField()), 'active': BooleanField(), 'stats-hourly': { 'last_visits': IntegerField(), 'average_visits': DoubleField() }, 'stats-daily': { 'last_visits': IntegerField(), 'average_visits': DoubleField() }, 'stats-monthly': { 'last_visits': IntegerField(), 'average_visits': DoubleField() } }
您可以使用ObjectField以更简洁的方式编写它:
from mongo_dynamic_fixture.fields import ObjectField obj_field = ObjectField({'last_visits': IntegerField(), 'average_visits': DoubleField()}) class SiteSchema(BaseSchema): schema = { 'name': StringField(), 'aliases': ArrayField(StringField()), 'active': BooleanField(), 'stats-hourly': obj_field, 'stats-daily': obj_field, 'stats-monthly': obj_field }
安装
pip install mongo-dynamic-fixture
相容性
测试时间:
- python2.7和pymongo>=2.0
- python3.3、python3.4和pymongo>=2.2
贡献
任何建议、改进、问题和请打开一个问题。
发布历史记录
v0.2.1
- 修正了StringField和ArrayField的min_length从0到1
- 函数的简化接口N和G
v0.2.0
- 添加了python3.3和python3.4兼容性
- 使用tox 配置测试
- 集成travis ci
- 综合工作服
v0.1.0
- 添加了模块mongo_dynamic_fixture.fields、mongo_dynamic_fixture.fixture和mongo_dynamic_fixture.schema以生成数据
- 添加了模块mongo_dynamic_fixture.facades,其中包含外墙函数N和G
- 添加了包含MongoTestCase的模块mongo_dynamic_fixture.test以使用沙盒mongo实例运行测试