zoukankan      html  css  js  c++  java
  • python中强大的testdata库自动生成测试所需要的数据

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

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

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

    pip install python-testdata

    遇到下面的报错信息

    Command "python setup.py egg_info" failed with error code 1 in c:usersadmini~1appdatalocal	emppip-build-k1cjcxfake-factory

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

    pip install fake-factory

    接着安装

    pip install --no-deps python-testdata

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

    import testdata
    import random
    
    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'])
    for user in Users().generate(10): # let say we only want 10 users 
    print user

    出现如下的错误提醒:

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

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

    pip install fake-factory==0.7.4

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

    {'gender': 'male', 'age': 10, 'id': 10, 'address': u'09953 Sweeney Springs
    Jenniferside, FM 00653-9018'}
    {'gender': 'female', 'age': 14, 'id': 11, 'address': u'59348 Mike Trail Apt. 106
    North Scotthaven, DE 04666'}
    {'gender': 'male', 'age': 28, 'id': 12, 'address': u'53128 Archer Island Suite 256
    South Michaelfurt, MI 83350'}
    {'gender': 'male', 'age': 18, 'id': 13, 'address': u'3559 Kimberly Wall Apt. 924
    Justinfort, FM 41543-5666'}
    {'gender': 'male', 'age': 14, 'id': 14, 'address': u'54451 Fisher Mount
    North Michelle, UT 50280-8984'}
    {'gender': 'male', 'age': 22, 'id': 15, 'address': u'PSC 4666, Box 4608
    APO AE 90517-5117'}
    {'gender': 'male', 'age': 12, 'id': 16, 'address': u'6186 Lisa Groves Apt. 593
    Stephenberg, TN 15302-7752'}
    {'gender': 'female', 'age': 19, 'id': 17, 'address': u'3919 White Drives
    North Calvinport, MD 26577-9590'}
    {'gender': 'female', 'age': 30, 'id': 18, 'address': u'148 Anthony Mountain
    Stevenfort, RI 38933-9947'}
    {'gender': 'female', 'age': 27, 'id': 19, 'address': u'2496 Michael Groves Apt. 021
    West Kathleenside, PR 42583-3035'}

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

    import testdata

    class
    ExampleFactory(testdata.DictFactory): a = testdata.CountingFactory(10) b = testdata.ClonedField("a") # b will have the same value as field 'a' for e in ExampleFactory().generate(5): print e

    此时生成的数据为

    {'a': 10, 'b': 10}
    {'a': 11, 'b': 11}
    {'a': 12, 'b': 12}
    {'a': 13, 'b': 13}
    {'a': 14, 'b': 14}

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

    import testdata
    import datetime
    
    EVENT_TYPES = ["USER_DISCONNECT", "USER_CONNECTED", "USER_LOGIN", "USER_LOGOUT"]
    class EventsFactory(testdata.DictFactory):
        start_time = testdata.DateIntervalFactory(datetime.datetime.now(), datetime.timedelta(minutes=12))
        end_time = testdata.RelativeToDatetimeField("start_time", datetime.timedelta(minutes=20))
        event_code = testdata.RandomSelection(EVENT_TYPES)
    
    for event in EventsFactory().generate(5):
        print event

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

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

    生成的数据为

    {'state': 'pending', 'assigned_user': 'admin', 'description': 'HKCVoGAOJZVKYqGktTakWqewxScyUSSGcMj'}
    {'state': 'pending', 'assigned_user': 'admin', 'description': 'dyyLbtxfoqotlaNfWieoVvXFlzRYNOajYFVmwtXDRdVoQItDnjgptpEiBJHBgCuzqOZVwsxyWbByrJvgiTKKNyuiSsKO'}
    {'state': 'error', 'assigned_user': 'support', 'description': 'nuvRQyhcvvXWJuXhCbWVUyWAmKoioTcYIBHtcPwvgRytCsPlWEvSHRFjXDUAIgPblhhHFTKzCmmitBErHzpXLBoI'}
    {'state': 'pending', 'assigned_user': 'admin', 'description': 'IhrQoAkFNwqfZSxfkwCSmaGRFodFZYVHCegEnAMpTBtqUZMgaFGlAaznzUNbDrdgPDHNrAvJEQZRDUQxdDKsLvXJiMDR'}
    {'state': 'pending', 'assigned_user': 'admin', 'description': 'ftINruSFdOeAqOuDyInNgIrQPoegOwlqWSFIHYNVY'}

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

    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
        print user

    生成的数据为

    {'name': 'John', 'gender': 'male', 'age': 40, 'email': u'brownamy@yahoo.com', 'address': u'813 Donald Route
    South Andrea, SC 99925', 'id': 15}
    {'name': 'John', 'gender': 'female', 'age': 58, 'email': u'gloriapatel@may-mitchell.com', 'address': u'73919 Hodges Courts
    Tammyside, ME 89926-3945', 'id': 16}
    {'name': 'John', 'gender': 'male', 'age': 45, 'email': u'ashley40@cooper.info', 'address': u'95546 Mary Flats
    West Codystad, PA 34744', 'id': 17}
    {'name': 'John', 'gender': 'female', 'age': 43, 'email': u'xwhite@pierce-sutton.com', 'address': u'4051 Reese Mission Suite 829
    New Danny, NE 92155-8318', 'id': 18}
    {'name': 'John', 'gender': 'male', 'age': 60, 'email': u'qpoole@rice.com', 'address': u'3584 Bright Ramp
    Johnstonmouth, 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的粗略翻译

  • 相关阅读:
    零知识证明,中间人攻击,盲签名:原理和应用——三篇密码学科普文章
    json
    优化自己的编写出来的C#程序
    C++中不同的继承方式
    C语言程序编写涉及内存的问题
    面向Android的Tesseract工具
    常见Linux使用的十大问题
    Java语言链接数据库连接池配置的两种技巧
    配置数据库连接池的技巧
    PHP和Java在Web开发下相比较
  • 原文地址:https://www.cnblogs.com/milian0711/p/7815935.html
Copyright © 2011-2022 走看看