帮助生成内容以填充测试数据库的小程序包
fake-gen的Python项目详细描述
假发电机
为测试生成数据的简单包。
Fake_Gen提供生成内容的基本工厂类和dictFactory类。 它还提供了许多提供扩展功能的更专业的工厂。 每个工厂实例都知道它将生成多少元素,这使我们能够生成统计结果。
如果您希望生成稍后将输入到nosql的基于文档的数据,那么dictfactory尤其有用。 数据库
此外,使用dictfactory和dependentfield工厂允许我们创建依赖于结果的工厂 其他工厂。(有关更多信息,请参见示例)。
fake_gen没有绑定到指定的数据库,但在其中包含数据库特定模块,如-extra.mongodb.py) 但它将始终清除与数据库相关的依赖项。
安装
pip install fake-gen
示例
我们集成了awsome faker包来使用fakedatafactory生成数据, 这允许我们生成各种内容,如: *姓名(名字、姓氏、全名) *公司 *地址 *电子邮件 *网址 *还有更多
让我们创建一个生成用户的非常简单的工厂:
importfake_genclassUsers(fake_gen.DictFactory):id=fake_gen.CountingFactory(10)firstname=fake_gen.FakeDataFactory('firstName')lastname=fake_gen.FakeDataFactory('lastName')address=fake_gen.FakeDataFactory('address')age=fake_gen.RandomInteger(10,30)gender=fake_gen.RandomSelection(['female','male'])foruserinUsers().generate(10):# let say we only want 10 usersprintuser# {'firstname': 'Toni', 'lastname': 'Schaden', 'gender': 'female', 'age': 18, 'address': '0641 Homenick Hills\nSouth Branson, RI 70388', 'id': 10}# {'firstname': 'Gene', 'lastname': 'Greenfelder', 'gender': 'male', 'age': 17, 'address': '292 Loy Lights Suite 328\nFritzfort, IN 73914', 'id': 11}# or more likely you'd want to insert them into your favorite database (MongoDB, ElasticSearch, ..)
在为dictfactory创建自己的子类时,我们可以使一些字段依赖于其他字段。 例如:
classExampleFactory(DictFactory):a=CountingFactory(10)b=ClonedField("a")# b will have the same value as field 'a'foreinExampleFactory().generate(100):printe# {'a': 10, 'b': 10}# {'a': 11, 'b': 11}# ...
假设我们想要生成类似事件数据的东西,我们想要事件具有 一个开始时间,一个结束时间是20分钟。 此外,我们希望活动的开始时间相隔12分钟。
importfake_genEVENT_TYPES=["USER_DISCONNECT","USER_CONNECTED","USER_LOGIN","USER_LOGOUT"]classEventsFactory(fake_gen.DictFactory):start_time=fake_gen.DateIntervalFactory(datetime.datetime.now(),datetime.timedelta(minutes=12))end_time=fake_gen.RelativeToDatetimeField("start_time",datetime.timedelta(minutes=20))event_code=fake_gen.RandomSelection(EVENT_TYPES)foreventinEventFactory().generate(100):printevent# {'start_time': datetime.datetime(2013, 12, 23, 13, 37, 1, 591878), 'end_time': datetime.datetime(2013, 12, 23, 13, 57, 1, 591878), 'event_code': 'USER_CONNECTED'}# {'start_time': datetime.datetime(2013, 12, 23, 13, 49, 1, 591878), 'end_time': datetime.datetime(2013, 12, 23, 14, 9, 1, 591878), 'event_code': 'USER_LOGIN'}# {'start_time': datetime.datetime(2013, 12, 23, 14, 1, 1, 591878), 'end_time': datetime.datetime(2013, 12, 23, 14, 21, 1, 591878), 'event_code': 'USER_DISCONNECT'}
我们也有工厂,允许我们生成按不同百分比分布的不同数据,例如, 假设我们要创建一个“作业”,它将有一个分配的用户字段、一个状态字段和一个描述字段。 我们希望90%的字典中的状态为“挂起”,其余字典中的状态为“错误”。另外,如果“state”字段是 “error”分配的用户将是“support”,否则应该是“admin”。
classJob(fake_gen.DictFactory):state=fake_gen.StatisticalValuesFactory([('pending',90),('error',10)])assigned_user=fake_gen.ConditionalValueField('state',{'error':'support'},'admin')description=fake_gen.RandomLengthStringFactory()foriinJob().generate(10):printi# {'state': 'error', 'assigned_user': 'support', 'description': 'jUlyFByPxPdFlBPBfPaGaTPPuajFSHXKkyewzrQ'}# {'state': 'pending', 'assigned_user': 'admin', 'description': 'tOzkgmBBnxQZhSYEjVduyXGdLrtqeTZqRxmHNXbaJBfpdNxuLKWyTDxkCZgiZTLHeiKEswvIyDzAnuuOLtXmVWhjvazaOYuu'}# {'state': 'pending', 'assigned_user': 'admin', 'description': 'TIDVuvZRUBLLTtG'}# {'state': 'pending', 'assigned_user': 'admin', 'description': 'RgcSaFzmMrhwCAZjLofikmXJhtqkVOTsWHnqTXjgrxgzTKH'}# {'state': 'pending', 'assigned_user': 'admin', 'description': 'tLkSEkCbYDvlcDBDWUBGMmidEdOxeiLDBADDKnqGqWLnxUBqzOXFXnBxkiGTymuGNbUnmxyawzLGsiummCiwxNSw'}# {'state': 'pending', 'assigned_user': 'admin', 'description': 'tUyYLofuZpceaWYKkiRvksQLqFHGOiwACuPIvRxMIuftJPsObSqCBcrQnOkOhqAukfMwrY'}# {'state': 'pending', 'assigned_user': 'admin', 'description': 'JbFrUxrERMObfwhEtCQGcxEbimvoTFwJriSfRFLFkBpyemqEfqUCGKmVlgSlVoZrrnetEnLCgbfobFbTMQOZ'}# {'state': 'pending', 'assigned_user': 'admin', 'description': 'lqatAwdcQuMMOPiYdVMRyyQgEIzOlcoozijjdCfXsVoZnnTtQjPSGBFZQGSkPblJrTIYLAotiZoyYRFrlncevwuNcqfOmeXeCPD'}# {'state': 'pending', 'assigned_user': 'admin', 'description': 'VYxnhydWtIUFiOEPszVQHuxYBIUGDyAefZiPIgkWHCMmophiueXbixXtdwKQkuvWImuErMOOOcwevQHGApXkolhjAq'}# {'state': 'pending', 'assigned_user': 'admin', 'description': 'RcawgTkQggchdHppSyQxnbDdNxqkGqbQWnQMSlorqnAQLdAqyWnKtGpXaZuVdxcGQBImzVPQsYAbIFUIpqvDzwTDdRpleBrc'}
1.0.5中,我们扩展了独占工厂,以支持通过额外的工厂,或覆盖现有工厂,用于特定的实例。 让我们从一开始就以我们的“用户”为例。
importfake_genclassUsers(fake_gen.DictFactory):id=fake_gen.CountingFactory(10)firstname=fake_gen.FakeDataFactory('firstName')lastname=fake_gen.FakeDataFactory('lastName')address=fake_gen.FakeDataFactory('address')age=fake_gen.RandomInteger(10,30)gender=fake_gen.RandomSelection(['female','male'])
但是让我们重写它,这样“firstname”总是返回john,并将年龄设置为40到60之间的随机整数,然后添加一个“email”字段。
foruserinUsers(firstname=fake_gen.Constant('John'),age=fake_gen.RandomInteger(40,60),email=fake_gen.FakeDataFactory('email')).generate(10):# let say we only want 10 usersprintuser#{'firstname': 'John', 'gender': 'male', 'age': 54, 'email': 'hazle.wehner@brekke.com', 'lastname': 'Willms', 'address': '245 Pfeffer Light Apt. 309\nEast Audieside, IN 11931', 'id': 10}#{'firstname': 'John', 'gender': 'male', 'age': 47, 'email': 'mariam25@gmail.com', 'lastname': 'Ratke', 'address': '98710 Freddy Gateway\nDelilahborough, GU 50849', 'id': 11}#{'firstname': 'John', 'gender': 'male', 'age': 55, 'email': 'tyler22@yahoo.com', 'lastname': 'Cormier', 'address': '432 Block Locks Apt. 547\nNew Estel, NJ 54026', 'id': 12}# or more likely you'd want to insert them into your favorite database (MongoDB, ElasticSearch, ..)
工厂
有关更多示例和doctest,请参阅factorie的docstrings。
碱基
Factory Class | Description |
---|---|
Factory | The base class of all the factories. |
DictFactory | A very powerful base class. allows sub classing to create factories that generate dicts with a specific schema (see [Examples][#Examples]). |
ListFactory | A factory that returns on each iteration a list of ^{ |
Callable | Gets a callable object as an argument and returns the result of calling the object on every iteration |
DependentCallable | Gets a callable object as an argument and returns the result of calling the object passing the defined fields as arguments on every iteration |
ClonedField | A factory that copies the value of another factory. |
日期
Factory Class | Description |
---|---|
RandomDateFactory | Generates random dates (python's datetime) between 2 dates |
DateIntervalFactory | Generates datetime objects starting from ^{ |
RelativeToDatetimeField | Generates datetime object relative to another datetime field, like if you have ^{ |
还有更多……
待办事项
- 为每个工厂添加使用文档(可能使用doctest?)
- 添加更多测试
- 添加geolocationfactories以生成与位置和距离相关的数据(例如,中心点附近的随机点)。
- 添加更多统计工厂
- 欢迎更多想法!