testdata是用于生成测试数据的一个安装包,它不仅提供DictFactory类来生成数据,还提供特定的扩展功能。每个Factory实例均可用于生成用户所需要的特定个数的数据,这将使我们更好地统计分析结果

如果你的目的是生成数据并将其存储到数据库或基于数据库的文档,DictFactory将会变得更加快捷

首先安装testdata,我用的是python2.7版本,在用

  1. pip install python-testdata

遇到下面的报错信息

  1. Command "python setup.py egg_info" failed with error code 1 in c:\users\admini~1\appdata\local\temp\pip-build-k1cjcx\fake-factory\

如下是解决方法:先安装fake-factory

  1. pip install fake-factory

接着安装

  1. pip install --no-deps python-testdata

然后运行下面的程序,由于我所装的版本统一用name替代了firstName和 lastName,在原文的基础下进行下改动

  1. import testdata
  2. import random
  1. class Users(testdata.DictFactory):
    id = testdata.CountingFactory(10)
    name = testdata.FakeDataFactory('name')
    address = testdata.FakeDataFactory('address')
    age = testdata.RandomInteger(10, 30)
    gender = testdata.RandomSelection(['female', 'male'])
  1. for user in Users().generate(10): # let say we only want 10 users
    print user

出现如下的错误提醒:

  1. raise ImportError(error)
  2. ImportError: The ``fake-factory`` package is now called ``Faker``.

继续解决报错,原来是fake-factory的安装版本不对,重新安装并指定安装版本

  1. pip install fake-factory==0.7.4

接下来就可以见证生成的数据啦

  1. {'gender': 'male', 'age': 10, 'id': 10, 'address': u'09953 Sweeney Springs\nJenniferside, FM 00653-9018'}
  2. {'gender': 'female', 'age': 14, 'id': 11, 'address': u'59348 Mike Trail Apt. 106\nNorth Scotthaven, DE 04666'}
  3. {'gender': 'male', 'age': 28, 'id': 12, 'address': u'53128 Archer Island Suite 256\nSouth Michaelfurt, MI 83350'}
  4. {'gender': 'male', 'age': 18, 'id': 13, 'address': u'3559 Kimberly Wall Apt. 924\nJustinfort, FM 41543-5666'}
  5. {'gender': 'male', 'age': 14, 'id': 14, 'address': u'54451 Fisher Mount\nNorth Michelle, UT 50280-8984'}
  6. {'gender': 'male', 'age': 22, 'id': 15, 'address': u'PSC 4666, Box 4608\nAPO AE 90517-5117'}
  7. {'gender': 'male', 'age': 12, 'id': 16, 'address': u'6186 Lisa Groves Apt. 593\nStephenberg, TN 15302-7752'}
  8. {'gender': 'female', 'age': 19, 'id': 17, 'address': u'3919 White Drives\nNorth Calvinport, MD 26577-9590'}
  9. {'gender': 'female', 'age': 30, 'id': 18, 'address': u'148 Anthony Mountain\nStevenfort, RI 38933-9947'}
  10. {'gender': 'female', 'age': 27, 'id': 19, 'address': u'2496 Michael Groves Apt. 021\nWest Kathleenside, PR 42583-3035'}

我们也可以构造一个数据依赖于另一个数据的情况,如下

  1. import testdata
  2.  
  3. class ExampleFactory(testdata.DictFactory):
  4. a = testdata.CountingFactory(10)
  5. b = testdata.ClonedField("a") # b will have the same value as field 'a'
  6.  
  7. for e in ExampleFactory().generate(5):
  8. print e

此时生成的数据为

  1. {'a': 10, 'b': 10}
  2. {'a': 11, 'b': 11}
  3. {'a': 12, 'b': 12}
  4. {'a': 13, 'b': 13}
  5. {'a': 14, 'b': 14}

若我们的需求是生成事件数据,比如我们是构造一个事件的开始和结束时间,并且结束时间要在开始时间的20分钟后结束,并且,我们希望各个数据的开始时间间隔12分钟

  1. import testdata
  2. import datetime
  3.  
  4. EVENT_TYPES = ["USER_DISCONNECT", "USER_CONNECTED", "USER_LOGIN", "USER_LOGOUT"]
  5. class EventsFactory(testdata.DictFactory):
  6. start_time = testdata.DateIntervalFactory(datetime.datetime.now(), datetime.timedelta(minutes=12))
  7. end_time = testdata.RelativeToDatetimeField("start_time", datetime.timedelta(minutes=20))
  8. event_code = testdata.RandomSelection(EVENT_TYPES)
  9.  
  10. for event in EventsFactory().generate(5):
  11. print event

若要生成百分比不同的数据,比如我们想要构造工作的数据,包含用户名、状态、描述,其中状态为pending的占90%,剩下的10%的状态为‘error’。除此之外,如果状态为error的用户该为‘support’,状态为pending的用户应为‘admin’

  1. class Job(testdata.DictFactory):
  2. state = testdata.StatisticalValuesFactory([('pending', 90), ('error', 10)])
  3. assigned_user = testdata.ConditionalValueField('state', {'error': 'support'}, 'admin')
  4. description = testdata.RandomLengthStringFactory()
  5.  
  6. for i in Job().generate(10):
  7. print i

生成的数据为

  1. {'state': 'pending', 'assigned_user': 'admin', 'description': 'HKCVoGAOJZVKYqGktTakWqewxScyUSSGcMj'}
  2. {'state': 'pending', 'assigned_user': 'admin', 'description': 'dyyLbtxfoqotlaNfWieoVvXFlzRYNOajYFVmwtXDRdVoQItDnjgptpEiBJHBgCuzqOZVwsxyWbByrJvgiTKKNyuiSsKO'}
  3. {'state': 'error', 'assigned_user': 'support', 'description': 'nuvRQyhcvvXWJuXhCbWVUyWAmKoioTcYIBHtcPwvgRytCsPlWEvSHRFjXDUAIgPblhhHFTKzCmmitBErHzpXLBoI'}
  4. {'state': 'pending', 'assigned_user': 'admin', 'description': 'IhrQoAkFNwqfZSxfkwCSmaGRFodFZYVHCegEnAMpTBtqUZMgaFGlAaznzUNbDrdgPDHNrAvJEQZRDUQxdDKsLvXJiMDR'}
  5. {'state': 'pending', 'assigned_user': 'admin', 'description': 'ftINruSFdOeAqOuDyInNgIrQPoegOwlqWSFIHYNVY'}

另外,可以对字段进行重写和新增字段操作,在前面生成用户信息的例子中,我们可以将用户的名称设置为定值,并且新建email字段

  1. for user in Users(name=testdata.Constant('John'), age=testdata.RandomInteger(40, 60), email=testdata.FakeDataFactory('email')).generate(10): # let say we only want 10 users
  2. print user

生成的数据为

  1. {'name': 'John', 'gender': 'male', 'age': 40, 'email': u'brownamy@yahoo.com', 'address': u'813 Donald Route\nSouth Andrea, SC 99925', 'id': 15}
  2. {'name': 'John', 'gender': 'female', 'age': 58, 'email': u'gloriapatel@may-mitchell.com', 'address': u'73919 Hodges Courts\nTammyside, ME 89926-3945', 'id': 16}
  3. {'name': 'John', 'gender': 'male', 'age': 45, 'email': u'ashley40@cooper.info', 'address': u'95546 Mary Flats\nWest Codystad, PA 34744', 'id': 17}
  4. {'name': 'John', 'gender': 'female', 'age': 43, 'email': u'xwhite@pierce-sutton.com', 'address': u'4051 Reese Mission Suite 829\nNew Danny, NE 92155-8318', 'id': 18}
  5. {'name': 'John', 'gender': 'male', 'age': 60, 'email': u'qpoole@rice.com', 'address': u'3584 Bright Ramp\nJohnstonmouth, NV 12566-4343', 'id': 19}

上面例子中所用的基类如下

Factory类 简介
Factory   所有的Factory的基类
DictFactory 非常强大的基类,它可让子类创建Factory,具体可参考上面的例子
ListFactory A factory that returns on each iteration a list of elements_per_list items returned from calls to the given factory.
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类 简介 
 RandomDateFactory  Generates random dates (python's datetime) between 2 dates
 DateIntervalFactory  Generates datetime objects starting from base while adding delta to it each iteration.
 RelativeToDatetimeField  Generates datetime object relative to another datetime field, like if you have start_timewhich is a RandomDateFactory field, and want an end_time field that is always 15 minutes later.

本文是对https://github.com/arieb/python-testdata的粗略翻译

python中强大的testdata库自动生成测试所需要的数据的更多相关文章

  1. Python中使用模块和库编程

    """ python中使用模块和库编程 导入模块 import modulename [as alias] from modulename import fun1,fun ...

  2. Python中导入第三方声源库Acoular的逻辑解释以及Acoular的下载

    [声明]欢迎转载,但请保留文章原始出处→_→ 秦学苦练:http://www.cnblogs.com/Qinstudy/ 文章来源:http://www.cnblogs.com/Qinstudy/p/ ...

  3. 使用ctypes在Python中调用C++动态库

    使用ctypes在Python中调用C++动态库 入门操作 使用ctypes库可以直接调用C语言编写的动态库,而如果是调用C++编写的动态库,需要使用extern关键字对动态库的函数进行声明: #in ...

  4. python之gui-tkinter可视化编辑界面 自动生成代码

    首先提供资源链接 http://pan.baidu.com/s/1kVLOrIn#list/path=%2F

  5. python学习-- Django根据现有数据库,自动生成models模型文件

    Django引入外部数据库还是比较方便的,步骤如下 : 创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自 ...

  6. Python中处理日期时间库的使用方法(转载)

    <本文来自公众号“大邓带你玩python”,转载> 用百分之20时间,学会解决百分之80的问题. 常用的库有time.datetime.其中datetime库是对time库的封装,所以使用 ...

  7. python 中的json解析库

    当一个json 数据很大的时候.load起来是很耗时的.python中常见的json解析库有cjson,simplesjson,json, 初步比较了一下, 对于loads来讲 simplejson ...

  8. 【日常记录】Unity3D 中的 Surface Shader 是不支持在 Pass中使用的,因为自动生成了 Pass

    如题 搞了好久,一直报错: Shader error in 'custom_outline_effect': Parse error: syntax error, unexpected TOK_PAS ...

  9. Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题

    在EF中,使用linq进行分页是很方便的,假如我们有一个EMP表,结构如下: public class Emp { [Key] public Guid No { get; set; } public ...

随机推荐

  1. canvas常用画法整理

    代码Canvas.htm <!DOCTYPE html> <html lang="en"> <head> <title>canvas ...

  2. 运用session来控制用户的异地登录被挤下线情况

    在用QQ的过程中我们如果你的账号在另外一台手机上面登录,这是腾讯后台会提醒你异地登录,可能你的账号被盗了,然后你手机上得QQ就会被退出登录,这个时候你就需要重新登录修改密码,以确保账号的安全.那这种被 ...

  3. morphia(2)-添加

    1.简单 @Test public void add() throws Exception { final Employee em = new Employee("遥远2",500 ...

  4. python入门之流程控制

    if else 格式: if 条件 command1 command2elif 条件: command3    command4 else: command3 command4 注意条件后和else后 ...

  5. 接口测试02 - 无法绕过的json解析

    概述: 先瞧一下什么是json.JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式. 它基于ECMAScript(w3c定制的js规范)的一个子集 ...

  6. bio,nio,aio简介

    https://mp.weixin.qq.com/s/F9WwcsFdCOwOeeDc0oc98w——<BIO,NIO,AIO 总结>总结和对比这三种的区别 https://www.jia ...

  7. Unity加载AssetBundle的方法

    using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; usin ...

  8. Java环境安装与Eclipse安装

    1.jdk下载安装 2.Eclipse下载安装 遇到的问题: 出现问题原因可能有两个:1)没有配置环境变量 2)jdk和eclipse安装的版本不一致,都是64位或者都是32位. 本人出现错误的原因: ...

  9. JS中数组的介绍

    一.数组: 一组数据的集合: 二.JS中数组的特点: 1.数组定义时无需指定数据类型: 2.数组定义时可以无需指定数组长度: 3.数组可以存储任何类型的数据: 4.一般是相同的数据类型: 三.数组的创 ...

  10. SQL Server 2008 转换为 SQL 2005 数据库 脚本生成

    Tips: 本文讨论如何把数据库从SQL Server 2008版本降低到2005,因为在本地开发是以SQL Server 2008 Express Edition版本进行的,而主机提供商现在提供的M ...