Mongo动态夹具

mongo-dynamic-fixture的Python项目详细描述


https://travis-ci.org/se7entyse7en/mongo-dynamic-fixture.svg?branch=masterhttps://coveralls.io/repos/se7entyse7en/mongo-dynamic-fixture/badge.svg?branch=master&service=github

动机

  • 使用静态json fixture可能会很痛苦,因为如果数据发生变化,它们很难维护
  • 添加新的测试通常需要添加新的静态json fixture
  • 如果在多个测试用例中使用了静态json fixture,即使稍加更改也会破坏所有测试用例

灵感

这个图书馆的灵感来自django-dynamic-fixture

基本用法

基本函数是NG,分别代表newget。 首先,必须定义要生成的数据的架构:

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}}

函数NBaseSchema的一个实例作为第一个参数,并生成一个与提供的模式兼容的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}}

如您所见,activelast_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

如果requiredFalse,则按not_present_prob给定的概率,该字段将不在文档中。

如果nullTrue,则以null_prob给定的概率,该字段的值将为None

如果blankTrue,那么根据blank_prob给定的概率,该字段将有一个空值,该值取决于该字段。

每个字段的空白字段如下:

  • IntegerField->;0
  • DoubleField->;0.0
  • BooleanField->;False
  • StringField->;''
  • ArrayField->;[]
  • ObjectField->;{}

IntegerFieldDoubleField也采用min_valuemax_value作为可选参数,而StringFieldArrayField也采用min_lengthmax_lengthIntegerFieldDoubleFieldStringField还将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.7pymongo>=2.0
  • python3.3python3.4pymongo>=2.2

贡献

任何建议、改进、问题和请打开一个问题。

发布历史记录

v0.2.1

  • 修正了StringFieldArrayFieldmin_length01
  • 函数的简化接口NG

v0.2.0

  • 添加了python3.3python3.4兼容性
  • 使用tox
  • 配置测试
  • 集成travis ci
  • 综合工作服

v0.1.0

  • 添加了模块mongo_dynamic_fixture.fieldsmongo_dynamic_fixture.fixturemongo_dynamic_fixture.schema以生成数据
  • 添加了模块mongo_dynamic_fixture.facades,其中包含外墙函数NG
  • 添加了包含MongoTestCase的模块mongo_dynamic_fixture.test以使用沙盒mongo实例运行测试

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
具有未知数量条件的java If语句   java如何在Spark中使用两个“条件”进行过滤?   雅加达ee为ColdFusion提供的最佳Java ee服务器   java如何在jersey的MessageBodyWriter方法中获取writeTo中的anotations值?   java从脚本文件调用jar文件中的函数   java在执行insert语句后,如何获得id值为的语句?   在OS X上设置OpenCV Java绑定   java使用for循环遍历数组x。以字符串形式返回x的元素,其中每个元素由一个空格分隔   ApacheiClientBuilder为Algolia Java创建的APIClient是线程安全的吗?   java在DFS/BFS算法中获取邻居时避免内存分配?   java使用AES/CBC/PKCS5P加密大文件(2GB)   允许保存/加载列布局的Java DB网格组件   队列大小为1的java Spring调度   跑步带有Java参数的exe   java正则表达式将所有“<”和“>”标记替换为“&lt;”及“&gt;”在<<![CDATA]>标签?   java何时同步变量?