Fake data的使用和產(chǎn)生 - Python篇

什么是Fake data

Fake data顧名思義假數(shù)據(jù),是在真實產(chǎn)品數(shù)據(jù)無法使用的情況下四苇,產(chǎn)生地接近于產(chǎn)品環(huán)境的數(shù)據(jù),多用于開發(fā)和測試。

Fake data的使用場景

有哪些開發(fā)或測試場景會使用fake data兑徘?

  1. 當你需要開發(fā)一個UI原型,但是API還沒開發(fā)完成繼而無法獲取相關數(shù)據(jù)來顯示到前端羡洛,這個時候挂脑,就可以使用mock data來模擬API,從而不阻礙UI的開發(fā)工作且使UI和API的開發(fā)并行欲侮,也有可能提早發(fā)現(xiàn)一些問題
  2. 當需要產(chǎn)生大量的數(shù)據(jù)填充數(shù)據(jù)庫的時候崭闲,可以使用自動化填充接近于產(chǎn)品數(shù)據(jù)的fake data到數(shù)據(jù)庫來滿足開發(fā)測試需求
  3. 當需要大量類產(chǎn)品環(huán)境數(shù)據(jù)進行壓力測試的時候
  4. 單元測試需要產(chǎn)生dummy data的時候

Fake data的原則

除了刻意設計的破壞性的test data,我們需要的test data應該是接近于產(chǎn)品環(huán)境和現(xiàn)實生活的威蕉,而不是固定的搭配刁俭。接近于產(chǎn)品數(shù)據(jù)的fake data能夠更好地揭露產(chǎn)品環(huán)境潛在的問題,讓產(chǎn)品看起來具有真實的使用價值和意義韧涨。

Fake data的實現(xiàn)方式

在我目前工作的項目中牍戚,需要填寫各種各樣的表單侮繁,這些表單收集中不同的用戶數(shù)據(jù),如果每一次我都填不同的數(shù)據(jù)來測試如孝,是不是會更接近于產(chǎn)品的真實使用情況宪哩,說不定還能挖掘出一些潛在問題。產(chǎn)品環(huán)境的數(shù)據(jù)由于安全隱私不能觸碰第晰,那么如何產(chǎn)生大量的假數(shù)據(jù)呢锁孟?主要有下面兩種

這篇文章會介紹Python的四個用于產(chǎn)生fake data的module

  • lipsum - is a simple Lorem Ipsum generator library which can be used in your Python applications
  • radar - Random date generation
  • mimesis - is a fast and easy to use library for Python programming language, which helps generate mock data for a variety of purposes in a variety of languages
  • Faker - is a Python package that generates fake data for you

安裝Python3

在開始之前,先升級下python吧甜熔,官方都說了

Python 2.x is legacy, Python 3.x is the present and future of the language

況且很多流行庫比如numpy都會不在繼續(xù)維護python2圆恤,繼而開始在python3上開發(fā)維護。那還有什么理由堅持python2呢腔稀?

想看python2還有多久退休哑了,請參考這里

我現(xiàn)在的Python開發(fā)環(huán)境還是macOS自帶python 2.7.10烧颖,所以需要通過Homebrew去安裝python3.具體的教程可以參考這里還有這里弱左。

┌─[diyu@CNdiyu] - [~] - [Wed Jan 10, 16:14]
└─[$] <> python3 --version
Python 3.6.4

大功告成!

Lorem Ipsum 亂數(shù)假文

lipsum是一個隨機文本語句和片段生成器炕淮。生成的文本有意義的lorem ipsum文本拆火。

代碼非常簡單

import lipsum

print("generate 10 words")
print(lipsum.generate_words(10))

print("*" * 50)
print("generate 3 sentences")
for x in lipsum.generate_sentences(3).split('.'):
    print(x.strip())

print("*" * 50)
print("generate 3 paras")
for x in lipsum.generate_paragraphs(3).split('\n'):
    print(x)

輸出為

generate 10 words
Quae cum dixissem, magis ut illum provocarem quam ut ips!
**************************************************
generate 3 sentences
Hunc vos beatum; ratio quidemvestra sic cogit
At ego quem huic anteponam non audeo dicere;dicet pro me ipsa virtus necdubitabit isti vestro beato M
Regulumanteponere, quem quidem, cum sua voluntate, nulla vi coactuspraeter fidem, quamdederat hosti, ex patria Karthaginemrevertisset, tum ipsum, cum vigiliis et fame cruciaretur, clamatvirtus beatioremfuisse quam potantem in rosa Thorium

**************************************************
generate 3 paras
Atque haec quidem de rerum nominibus. de ipsis rebus autem saepenumero, Brute, vereor ne reprehendar, cum haec ad te
scribam, qui cum in philosophia, tum in optimo genere philosophiae tantum processeris. quod si facerem quasi te
erudiens, iure reprehenderer. sed ab eo plurimum absum neque, ut ea cognoscas, quae tibi notissima sunt, ad te mitto,
sed quia facillime in nomine tuo adquiesco, et quia te habeo aequissimum eorum studiorum, quae mihi communia tecum sunt,
existimatorem et iudicem. attendes igitur, ut soles, diligenter eamque controversiam diiudicabis, quae mihi fuit cum
avunculo tuo, divino ac singulari viro. nam in Tusculano cum essem vellemque e bibliotheca pueri Luculli quibusdam
libris uti, veni in eius villam, ut eos ipse, ut solebam, depromerem. quo cum venissem, M. Catonem, quem ibi esse
nescieram, vidi in bibliotheca sedentem multis circumfusum Stoicorum libris. erat enim, ut scis, in eo aviditas legendi,
nec satiari poterat, quippe qui ne reprehensionem quidem vulgi inanem reformidans in ipsa curia soleret legere saepe,
dum senatus cogeretur, nihil operae rei publicae detrahens. quo magis tum in summo otio maximaque copia quasi helluari
libris, si hoc verbo in tam clara re utendum est, videbatur. quod cum accidisset ut alter alterum necopinato
videremus, surrexit statim. deinde prima illa, quae in congressu solemus: Quid tu, inquit, huc? a villa enim, credo, et:
Si ibi te esse scissem, ad te ipse venissem.

Heri, inquam, ludis commissis ex urbe profectus veni ad vesperum. causa autem fuit huc veniendi ut quosdam hinc libros
promerem. et quidem, Cato, hanc totam copiam iam Lucullo nostro notam esse oportebit; nam his libris eum malo quam
reliquo ornatu villae delectari. est enim mihi magnae curae - quamquam hoc quidem proprium tuum munus est - ut ita
erudiatur, ut et patri et Caepioni nostro et tibi tam propinquo respondeat. laboro autem non sine causa; nam et avi eius
memoria moveor - nec enim ignoras, quanti fecerim Caepionem, qui, ut opinio mea fert, in principibus iam esset, si
viveret - et Lucullus mihi versatur ante oculos, vir cum virtutibus omnibus excellens, tum mecum et amicitia et omni
voluntate sententiaque coniunctus.

Praeclare, inquit, facis, cum et eorum memoriam tenes, quorum uterque tibi testamento liberos suos commendavit, et
puerum diligis. quod autem meum munus dicis non equidem recuso, sed te adiungo socium. addo etiam illud, multa iam mihi
dare signa puerum et pudoris et ingenii, sed aetatem vides.

類似loripsum.net這樣網(wǎng)站也提供在線生成服務。

radar 隨機日期生成

radar用來生成時間非常方便涂圆。

代碼也非常簡單

import radar
import datetime

#隨機日期
print(radar.random_date())
#隨機日期+時間
print(radar.random_datetime())
#隨機時間
print(radar.random_time())
#指定范圍隨機日期
print(radar.random_date(
start=datetime.datetime(year=1985, month=1, day=1),
stop=datetime.datetime(year=1989, month=12, day=30)))
#指定范圍隨機日期+時間
print(radar.random_datetime(
start=datetime.datetime(year=1985, month=1, day=1),
stop=datetime.datetime(year=1989, month=12, day=30)))
#指定范圍隨機時間
print(radar.random_time(
start="2018-01-10T09:00:10",
stop="2018-01-10T18:00:00"))
#radar默認使用python-dateutil庫來解析日期们镜,但是這個庫非常heavy,可以選擇使用輕量級的radar.utils.parse(快5倍)
print(radar.random_datetime(
start="2018-01-10T09:00:10",
stop="2018-01-10T18:00:00",
parse=radar.utils.parse))
#radar.utils.parse usage
start = radar.utils.parse('2018-01-01')
stop = radar.utils.parse('2018-01-05')
print(radar.random_datetime(start=start, stop=stop))

輸出為

2011-07-01
1997-10-25 16:59:15
04:45:21
1985-01-21 18:16:57
1988-06-27 02:49:24
12:49:16
2018-01-10 16:26:11
2018-01-02

Mimesis 產(chǎn)生mock data

mimesis提供了各類各樣數(shù)據(jù)润歉。這些數(shù)據(jù)涉及到十幾種真實使用場景模狭,比如Dummy data about transport (truck model, car etc.), Personal data (name, surname, age, email etc.), Payment data (credit_card, credit_card_network etc.)。

使用Mimesis首先要確定locale踩衩,Mimesis支持多達33種不同的語言嚼鹉,下面列子展示了德文和中文數(shù)據(jù)。

from mimesis import Personal
person_en = Personal('en')
print(person_en.full_name())
print(person_en.age())
print(person_en.favorite_movie())
print("*" * 20)
person_zh = Personal('zh')
print(person_zh.full_name())
print(person_zh.age())
print(person_zh.favorite_movie())

輸出為

Karoline Schneider
33
21
********************
香茗 米
22
星際迷航3:超越星辰

本文都以介紹英文為主

之前提到Mimesis提供多個不同的data provider來產(chǎn)生不同類別的數(shù)據(jù)驱富,下面介紹一些常用的provider以及基本使用方法锚赤。更多的providers請參考官方網(wǎng)站。

from mimesis import Personal, Address, Business, Payment, Text, Food
from mimesis.enums import Gender

person = Personal('en')
#可以傳遞性別給full_name()
print(person.full_name(Gender.MALE))
print(person.level_of_english())
print(person.nationality())
print(person.work_experience())
print(person.political_views())
print(person.worldview())

#自定義名字pattern
# pattern 可以有 ('U-d', 'U.d', 'UU-d', 'UU.d', 'UU_d', 'U_d', 'Ud', 'l-d', 'l.d', 'l_d', 'ld', 'default')
templates = ['l-d', 'U-d']
for item in templates:
    print(person.username(template=item))

address1 = Address('en')
print(address1.coordinates())
print(address1.city())

business1 = Business('en')
print(business1.company())
print(business1.company_type())

payment1 = Payment('en')
print(payment1.paypal())
print(payment1.credit_card_expiration_date())

#mimesis也可以生成文字
text1 = Text('en')
print(text1.alphabet())
print(text1.answer())
print(text1.quote())
print(text1.title())
print(text1.word())
print(text1.words())
print(text1.sentence())

food1 = Food('en')
print(food1.drink())
print(food1.fruit())
print(food1.spices())

Generic(*args, **kwargs)方法提供了統(tǒng)一的接口褐鸥,所有的provider都可以從這個方法進入

from mimesis import Generic

g = Generic('en')
print(g.food.fruit())
print(g.address.postal_code())

如果你想使用自己的數(shù)據(jù)线脚,想定制化一下,可以自定義類,通過類屬性和方法輸出數(shù)據(jù)浑侥。

g1 = Generic('en')

class oneProvider(BaseProvider):
    name = "dante"

    class Meta:
        name = "oneprovider"

    def get_age(self):
        return "31"

g1.add_provider(oneProvider)

print(g1.oneprovider.get_age())
print(g1.oneprovider.name)

如果不想一個一個生成數(shù)據(jù)姊舵,而是想依據(jù)schema批量生成多個,可以使用Field對象和Schema對象完成寓落。

field = Field('en')

body = (
    lambda: {
        #field里面的是API名稱
        "name" : field('full_name', gender=Gender.FEMALE),
        "age" : field('age'),
        "email" : field('email'),
        "occupation" : field('occupation')
    }
)
schema = Schema(schema=body)
print(schema.create(iterations=1))

Faker 產(chǎn)生fake data

Faker的使用和Mimesis很類似括丁。

Faker支持多語言。比如下面的列子就會輸出默認的en_US和中文zh_CN

from faker import Faker

fake = Faker()
print(fake.name())
print(fake.address())
print(fake.city())
print("*" * 20)
fake = Faker('zh_CN')
print(fake.name())
print(fake.address())
print(fake.city())

輸出為

eggy Wood
17796 Johnson Fork Apt. 744
Donaldhaven, DC 41460-2738
Cannonland
********************
向鵬
廣西壯族自治區(qū)梅縣大興夏路w座 617055
杭州市

Faker提供多個不同的data provider來產(chǎn)生不同類別的數(shù)據(jù)零如,下面介紹一些常用的provider以及基本使用方法。

from faker import Faker

fake = Faker()

# lorem ipsum
print(fake.word())
print(fake.text())
print(fake.paragraphs(5))

print(fake.company())
print(fake.credit_card_full())
print(fake.address())
print(fake.phone_number())
print(fake.date() + ' ' + fake.time())
print(fake.profile())

faker.providers支持創(chuàng)建自定義的provider

from faker import Faker
from faker.providers import BaseProvider

fake = Faker()

class oneProvider(BaseProvider):
    def hello(self):
        return "I am one provider"

fake.add_provider(oneProvider)
print(fake.hello())

Faker提供了命令行工具也非常方便锄弱,具體使用方法和可用參數(shù)考蕾,請參考官方文檔

└─[0] faker -h
usage: faker [-h] [--version] [-o output] [-l LOCALE] [-r REPEAT] [-s SEP]
             [-i [INCLUDE [INCLUDE ...]]]
             [fake] [fake argument [fake argument ...]]

faker version 0.8.8

positional arguments:
  fake                  name of the fake to generate output for (e.g. profile)
  fake argument         optional arguments to pass to the fake (e.g. the
                        profile fake takes an optional list of comma separated
                        field names as the first argument)

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit
  -o output             redirect output to a file
  -l LOCALE, --lang LOCALE
                        specify the language for a localized provider (e.g.
                        de_DE)
  -r REPEAT, --repeat REPEAT
                        generate the specified number of outputs
  -s SEP, --sep SEP     use the specified separator after each output
  -i [INCLUDE [INCLUDE ...]], --include [INCLUDE [INCLUDE ...]]
                        list of additional custom providers to user, given as
                        the import path of the module containing your Provider
                        class (not the provider class itself)

supported locales:

  ar_AA, ar_EG, ar_JO, ar_PS, ar_SA, bg_BG, bs_BA, cs_CZ, de_AT, de_DE, dk_DK, el_GR, en, en_AU, en_CA, en_GB, en_TH, en_US, es, es_ES, es_MX, et_EE, fa_IR, fi_FI, fr_CH, fr_FR, he_IL, hi_IN, hr_HR, hu_HU, id_ID, it_IT, ja_JP, ka_GE, ko_KR, la, lt_LT, lv_LV, ne_NP, nl_BE, nl_NL, no_NO, pl_PL, pt_BR, pt_PT, ru_RU, sk_SK, sl_SI, sv_SE, th_TH, tr_TR, tw_GH, uk_UA, zh_CN, zh_TW

  faker can take a locale as an argument, to return localized data. If no
  localized provider is found, the factory falls back to the default en_US
  locale.

examples:

  $ faker address
  968 Bahringer Garden Apt. 722
  Kristinaland, NJ 09890

  $ faker -l de_DE address
  Samira-Niemeier-Allee 56
  94812 Biedenkopf

  $ faker profile ssn,birthdate
  {'ssn': u'628-10-1085', 'birthdate': '2008-03-29'}

  $ faker -r=3 -s=";" name
  Willam Kertzmann;
  Josiah Maggio;
  Gayla Schmitt;

使用seed()可以重現(xiàn)之前的隨機數(shù)據(jù),這樣的話会宪,每次運行代碼就會產(chǎn)生一樣的數(shù)據(jù)肖卧。下面的代碼片段會產(chǎn)生一樣的結果,而不是每次都是隨機數(shù)據(jù)掸鹅。

from faker import Faker
fake = Faker()
fake.seed(9527)
print(fake.name())
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塞帐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子巍沙,更是在濱河造成了極大的恐慌葵姥,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件句携,死亡現(xiàn)場離奇詭異榔幸,居然都是意外死亡,警方通過查閱死者的電腦和手機矮嫉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門削咆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蠢笋,你說我怎么就攤上這事拨齐。” “怎么了昨寞?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵瞻惋,是天一觀的道長。 經(jīng)常有香客問我援岩,道長熟史,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任窄俏,我火速辦了婚禮蹂匹,結果婚禮上,老公的妹妹穿的比我還像新娘凹蜈。我一直安慰自己限寞,他們只是感情好忍啸,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著履植,像睡著了一般计雌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玫霎,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天凿滤,我揣著相機與錄音,去河邊找鬼庶近。 笑死翁脆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鼻种。 我是一名探鬼主播反番,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叉钥!你這毒婦竟也來了罢缸?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤投队,失蹤者是張志新(化名)和其女友劉穎枫疆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敷鸦,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡养铸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了轧膘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钞螟。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谎碍,靈堂內(nèi)的尸體忽然破棺而出鳞滨,到底是詐尸還是另有隱情,我是刑警寧澤拯啦,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站熔任,受9級特大地震影響褒链,放射性物質發(fā)生泄漏。R本人自食惡果不足惜疑苔,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一甫匹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦兵迅、人聲如沸抢韭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刻恭。三九已至,卻和暖如春扯夭,著一層夾襖步出監(jiān)牢的瞬間鳍贾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工交洗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留骑科,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓藕筋,卻偏偏與公主長得像纵散,于是被迫代替她去往敵國和親梳码。 傳聞我的和親對象是個殘疾皇子隐圾,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355