码迷,mamicode.com
首页 > 编程语言 > 详细

python中强大的testdata库自动生成测试所需要的数据

时间:2017-11-10 20:29:11      阅读:364      评论:0      收藏:0      [点我收藏+]

标签:scott   randomint   数据库   failed   ble   事件   版本   eve   job   

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

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

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

pip install python-testdata

遇到下面的报错信息

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

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: u09953 Sweeney Springs\nJenniferside, FM 00653-9018}
{gender: female, age: 14, id: 11, address: u59348 Mike Trail Apt. 106\nNorth Scotthaven, DE 04666}
{gender: male, age: 28, id: 12, address: u53128 Archer Island Suite 256\nSouth Michaelfurt, MI 83350}
{gender: male, age: 18, id: 13, address: u3559 Kimberly Wall Apt. 924\nJustinfort, FM 41543-5666}
{gender: male, age: 14, id: 14, address: u54451 Fisher Mount\nNorth Michelle, UT 50280-8984}
{gender: male, age: 22, id: 15, address: uPSC 4666, Box 4608\nAPO AE 90517-5117}
{gender: male, age: 12, id: 16, address: u6186 Lisa Groves Apt. 593\nStephenberg, TN 15302-7752}
{gender: female, age: 19, id: 17, address: u3919 White Drives\nNorth Calvinport, MD 26577-9590}
{gender: female, age: 30, id: 18, address: u148 Anthony Mountain\nStevenfort, RI 38933-9947}
{gender: female, age: 27, id: 19, address: u2496 Michael Groves Apt. 021\nWest 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: ubrownamy@yahoo.com, address: u813 Donald Route\nSouth Andrea, SC 99925, id: 15}
{name: John, gender: female, age: 58, email: ugloriapatel@may-mitchell.com, address: u73919 Hodges Courts\nTammyside, ME 89926-3945, id: 16}
{name: John, gender: male, age: 45, email: uashley40@cooper.info, address: u95546 Mary Flats\nWest Codystad, PA 34744, id: 17}
{name: John, gender: female, age: 43, email: uxwhite@pierce-sutton.com, address: u4051 Reese Mission Suite 829\nNew Danny, NE 92155-8318, id: 18}
{name: John, gender: male, age: 60, email: uqpoole@rice.com, address: u3584 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库自动生成测试所需要的数据

标签:scott   randomint   数据库   failed   ble   事件   版本   eve   job   

原文地址:http://www.cnblogs.com/milian0711/p/7815935.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!