样本数据生成器
项目描述
本包旨在尽最大努力支持样本数据生成器的开发。样本数据生成器是一个可插拔工具,用于创建测试所需的数据。
详细文档
可插拔样本数据框架
创建良好的测试环境是创建高质量软件的最重要方式。
但大多数时候,这是一件头疼的事情!
本包旨在尽最大努力支持样本数据生成器的开发。样本数据生成器是一个可插拔工具,用于创建测试所需的数据。
本框架有几个目标
为开发者提供接近实际使用的自动设置。
为用户提供易于评估的设置,使用合理的测试数据。
为用户提供管理不同样本生成器的接口。
该框架是可插拔的,允许生成器扩展的创建者提供自己的插件,为这些扩展生成样本数据。
生成器
生成器生成样本数据。
>>> from zope import interface >>> from zope import component >>> from z3c.sampledata.interfaces import ISampleDataPlugin>>> @interface.implementer(ISampleDataPlugin) ... class GeneratePrincipals(object): ... dependencies = [] ... schema = None ... def generate(self, context, param={}, dataSource=None, seed=None): ... print(self.__class__.__name__) ... if dataSource is not None: ... for data in dataSource: ... print('- %s'%data['login']) >>> principalPlugin = GeneratePrincipals()
对于我们的测试,我们提供了另一个生成器
>>> @interface.implementer(ISampleDataPlugin) ... class GenerateSite(object): ... dependencies = [] ... schema = None ... def generate(self, context, param={}, dataSource=None, seed=None): ... if 'sitename' in param: ... print('This is site %r'%param['sitename']) ... else: ... print(self.__class__.__name__) ... return 'I am from the site' >>> sitePlugin = GenerateSite()
生成器管理器
生成器管理器将一组生成器分组。管理器允许
定义生成器之间的依赖关系
定义依赖生成器之间的数据连接
提供默认配置数据
>>> from z3c.sampledata import Manager >>> manager = Manager('manager', '')
生成器插件
对于管理者,我们的样本生成器必须注册为命名服务。
>>> component.provideUtility(sitePlugin, ... ISampleDataPlugin,'z3c.sampledata.site') >>> component.provideUtility(principalPlugin, ... ISampleDataPlugin,'z3c.sampledata.principals')
生成样本数据
现在我们可以将生成器添加到管理者中。
>>> manager.add('z3c.sampledata.principals', ... dependsOn=['z3c.sampledata.site',], ... contextFrom='z3c.sampledata.site')
除了每个生成器中由依赖属性定义的“硬编码”依赖项外,还可以在生成器管理器中添加依赖项。
管理者提供了它的生成器。
>>> list(manager.generators.keys()) ['z3c.sampledata.principals']
我们可以告诉管理者生成所有样本。无需添加样本生成器“z3c.sampledata.site”,因为它会自动添加,因为依赖于“z3c.sampledata.principals”。
>>> infos = manager.generate(context=None, param={}, seed='something') GenerateSite GeneratePrincipals>>> [info.name for info in infos] ['z3c.sampledata.site', 'z3c.sampledata.principals']
样本生成器的参数
为了更好地控制样本生成过程,可以为生成器设置参数。
>>> manager = Manager('manager', '')>>> manager.add('z3c.sampledata.site', ... param={'sitename':'samplesite'})>>> manager.add('z3c.sampledata.principals', ... dependsOn=['z3c.sampledata.site',], ... contextFrom='z3c.sampledata.site')>>> infos = manager.generate(context=None, param={}, seed='something') This is site 'samplesite' GeneratePrincipals
还可以从配置中覆盖参数。
>>> infos = manager.generate(context=None, ... param={'z3c.sampledata.site': ... {'sitename':'managers site'}}, ... seed='something') This is site 'managers site' GeneratePrincipals
生成器定义中的循环
>>> manager = Manager('manager', '') >>> manager.add('z3c.sampledata.principals', ... dependsOn=['z3c.sampledata.site',], ... contextFrom='z3c.sampledata.site') >>> manager.add('z3c.sampledata.site', ... dependsOn=['z3c.sampledata.principals',])>>> infos = manager.generate(context=None, param={}, seed='something') Traceback (most recent call last): ... CyclicDependencyError: cyclic dependency at 'z3c.sampledata.principals'
一个复杂依赖关系的测试。
>>> @interface.implementer(ISampleDataPlugin) ... class Generator(object): ... name = 'generator' ... dependencies = [] ... schema = None ... def generate(self, context, param={}, dataSource=None, seed=None): ... return 'I am a generator' >>> component.provideUtility(Generator(), ISampleDataPlugin,'g.1') >>> component.provideUtility(Generator(), ISampleDataPlugin,'g.2') >>> component.provideUtility(Generator(), ISampleDataPlugin,'g.3') >>> manager = Manager('manager', '') >>> manager.add('g.1') >>> manager.add('g.2', contextFrom='g.1') >>> manager.add('g.3', dependsOn=['g.2', 'g.1'], contextFrom='g.1') >>> infos = manager.generate(context=None, param={}, seed=None) >>> [info.name for info in infos] ['g.1', 'g.2', 'g.3']
样本数据源
样本数据生成器通常从数据源获取样本数据。通常需要为不同的用途有不同的数据源。
例如,如果测试的样本数据与UI稍后提供给客户进行点击的数据相同,那么总是很痛苦。
>>> manager = Manager('manager', '')>>> manager.addSource('z3c.datasource.principals', ... data=[{'login':'jukart', 'password':'trakuj'}, ... {'login':'srichter', 'password':'rethcirs'}])>>> manager.add('z3c.sampledata.principals', ... dataSource='z3c.datasource.principals', ... dependsOn=['z3c.sampledata.site',], ... contextFrom='z3c.sampledata.site')>>> infos = manager.generate(context=None, param={}, seed='something') GenerateSite GeneratePrincipals - jukart - srichter
还可以使用适配器作为数据源。
>>> manager = Manager('manager', '')>>> class IPrincipalDataSource(interface.Interface): ... pass>>> def principalDataFactory(object): ... return [{'login':'jukart', 'password':'trakuj'}, ... {'login':'srichter', 'password':'rethcirs'}]>>> component.provideAdapter( ... factory=principalDataFactory, ... adapts=(ISampleDataPlugin,), ... provides=IPrincipalDataSource, ... name='testprincipals')>>> manager.addSource('z3c.datasource.principals', ... adapterName='testprincipals', ... adaptTo=IPrincipalDataSource)>>> manager.add('z3c.sampledata.principals', ... dataSource='z3c.datasource.principals', ... dependsOn=['z3c.sampledata.site',], ... contextFrom='z3c.sampledata.site')>>> infos = manager.generate(context=None, param={}, seed='something') GenerateSite GeneratePrincipals - jukart - srichter
如何设置生成器管理器的配置
可以使用ZCML进行配置。
<configure xmlns="http://namespaces.zope.org/zope"> <configure xmlns:zcml="http://namespaces.zope.org/zcml" zcml:condition="have devmode"> <utility factory=".SampleSite" provides="z3c.sampledata.interfaces.ISampleDataPlugin" name="z3c.site" /> <utility factory=".SamplePrincipals" provides="z3c.sampledata.interfaces.ISampleDataPlugin" name="z3c.principals" /> <SampleManager name="Site with principals" > <generator name="z3c.site" /> <generator name="z3c.principal" dependsOn="z3c.site" contextFrom="z3c.site" /> </SampleManager> </configure> </configure>
数据源
此包实现了数据生成器的基本功能。数据生成器用于为样本生成器提供原始数据。原始数据可以以不同的方式从文本文件中读取。
>>> from z3c.sampledata.data import DataGenerator >>> generator = DataGenerator(55)
生成器可以读取文件中的数据行。
>>> generator.readLines('testlines.txt') [u'Line 1', u'Another line']
生成器可以读取CSV文件中的数据。
>>> generator.readCSV('testlines.csv') [['Line 1', 'Col 2'], ['Another line', 'Another Col']]
生成器可以读取路径中的文件列表。
>>> import os >>> generator.files(os.path.dirname(__file__)) ['...README.txt', ...]
变更
2.0.0 (2015-11-09)
标准化__init__命名空间
2.0.0a1 (2013-03-04)
添加了对Python 3.3的支持。
完全删除了浏览器支持,因为它依赖于非常旧的o-wrap技术。此外,它包含大约7年前的一个可爱的特定项目语言。:-)
用等效的zope.interface.implementer装饰器替换了已废弃的zope.interface.implements用法。
删除了对Python 2.4和2.5的支持。
1.0.0 (2013-02-26)
将特殊SampleDataLayer设置的依赖项移动到“testing”额外组件。
添加了MANIFEST.in和tox.ini。
修复了文件头。
浏览器视图仅可通过“browser”额外组件使用。
将zope.app.pagetemplate依赖项更改为zope.browserpage。
0.4.0 (2010-08-30)
使用当前包。
0.3.1 (2010-08-30)
更新依赖项元数据,清理导入。
0.3.0 (2010-06-28)
配置测试运行器以运行功能测试。
删除了ZPKG和ZCML占位符。
现在需要zope.app.pagetemplate >= 3.6.0,因为zope.formlib.namedtemplate已移至其中,并且不再有BBB导入zope.formlib >= 4.0。
修复了与zope.app.authentication >= 3.7.0一起运行的测试。
修复了与zope.publisher >= 3.12.0一起运行的测试。
使用python的doctest模块代替已废弃的zope.testing.doctestunit。
0.2.0 (2010-06-25)
在ftesting.zcml中将zope.app.session调整为zope.session。
在ftesting.zcml中将zope.app.securitypolicy调整为zope.securitypolicy。
在zope包重构后修复了测试。更新了导入和依赖项。
0.1.0 (2008-02-14)
初始版本。
项目详情
z3c.sampledata-2.0.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a864bf990de701b1e5281d049d6b7a7cca4ca12f0b446bdd724423712c403e18 |
|
MD5 | c9cdfb0e89ecc5063d40a4f3aaf31463 |
|
BLAKE2b-256 | 5c175d6aa1efbbb35a2ecbdde91223b9d8e8ff4fb65aa1eb42a735ef4ba98033 |