居然還有人在手寫測(cè)試數(shù)據(jù)?

平時(shí)我們?cè)陂_(kāi)發(fā)程序的時(shí)候,總免不了需要造一些假數(shù)據(jù)來(lái)驗(yàn)證自己的程序功能是否正常。那么你是通過(guò)什么方式來(lái)造假數(shù)據(jù)的呢,不會(huì)每次都是手寫「測(cè)試數(shù)據(jù)、test」吧。
今天派森醬給大家介紹兩個(gè)超級(jí)好用的庫(kù),批量生成各種假數(shù)據(jù),比如用戶信息,地址,日期,數(shù)字等等。
mimesis
mimesis 是一個(gè)高性能的偽數(shù)據(jù)生成器,目前支持 33 種不同的語(yǔ)言環(huán)境。通過(guò)該庫(kù),我們可以生成各種測(cè)試數(shù)據(jù)、假的 API 接口、任意結(jié)構(gòu)的 JSON 和 XML 數(shù)據(jù)以及隱藏生產(chǎn)環(huán)境的數(shù)據(jù)。
pip?install?mimesis
安裝好之后我們就可以直接使用了。
from?mimesis?import?Person
person?=?Person('zh')
print(f'name:?{person.surname()?+?""?+?person.name()}')
print(f'sex:?{person.sex()}')
print(f'academic?degree:?{person.academic_degree()}')
##?輸出結(jié)果
name:?田曜巖
sex:?男性
academic?degree:?研究生
在上面的程序中,我們創(chuàng)建了一個(gè)使用中文環(huán)境的 Person 對(duì)象,接著輸出該用戶的姓名,性別以及學(xué)歷。
下面我們看看 Person 對(duì)象里面都有啥假數(shù)據(jù)。
print('\n'.join(('%s:%s'?%?item?for?item?in?person._data.items())))
結(jié)果如下所示:

除了姓名,性別這些基本信息之外還有學(xué)歷、性取向、大學(xué)以及信仰等信息。
另外,除了 Person 之外,mimesis 庫(kù)還提供了 Address、Food、Datetime 等方面的數(shù)據(jù)。
address?=?Address("zh")
print(f'continent:?{address.continent()}')
print(f'province:?{address.province()}')
print(f'city:?{address.city()}')
print(f'street?name:?{address.street_name()}')
##?輸出結(jié)果
province:?安徽省
city:?湛江市

除了省份,城市之外還有大陸、國(guó)家、州、街區(qū)等信息。
food?=?Food("zh")
print(f'dish:?{food.dish()}')
print(f'drink:?{food.drink()}')
##?輸出結(jié)果
dish:?東坡肉
drink:?紅茶

除了魚(yú)類和飲料之外還有水果、香料和蔬菜。
其實(shí) mimesis 庫(kù)的強(qiáng)大不止于此,甚至我們可以使用該庫(kù)來(lái)返回特定格式的數(shù)據(jù)。這就要借助 mimesis.schema 來(lái)實(shí)現(xiàn)了。
比如,我們要返回如下格式的 JSON 數(shù)據(jù),那么就可以這么寫:
_?=?Field('zh')
schema?=?Schema(schema=lambda:?{
????'id':?_('uuid'),
????'name':?_('person.name'),
????'version':?_('version',?pre_release=True),
????'timestamp':?_('timestamp',?posix=False),
????'owner':?{
????????'email':?_('person.email',?domains=['test.com'],?key=str.lower),
????????'token':?_('token_hex'),
????????'creator':?_('full_name',?gender=Gender.FEMALE)
????},
????'address':?{
????????'country':?_('address.country'),
????????'province':?_('address.province'),
????????'city':?_('address.city')
????}
})
#?生成數(shù)據(jù)
data?=?schema.create(iterations=2)
我們借助 Flask 快速實(shí)現(xiàn)一個(gè)接口:
@app.route('/apps',?methods=('GET',))
def?apps_view():
????count?=?request.args.get('count',?default=1,?type=int)
????data?=?schema.create(iterations=count)
????return?jsonify(data)
調(diào)用該接口獲得如下數(shù)據(jù):

faker
faker 同樣是一個(gè)優(yōu)秀的生成假數(shù)據(jù)的 Python 庫(kù),支持多種語(yǔ)言環(huán)境,我們可以使用 pip 進(jìn)行安裝。
pip?install?faker
試著獲取一下姓名,地址,日期等假數(shù)據(jù)
from?faker?import?Faker
faker?=?Faker(locale='zh_CN')
print(f'name:?{faker.name()}')
print(f'address:?{faker.address()}')
print(f'date:?{faker.date()}')
##?輸出結(jié)果
name:?劉晶
address:?香港特別行政區(qū)平縣華龍深圳路l座?580988
date:?2013-08-26

從上圖可以看出,faker 目前支持 22 個(gè)不同種類的假數(shù)據(jù)。
如果以上類別不能滿足需求,那么 faker 同樣支持自定義擴(kuò)展。
from?faker.providers?import?BaseProvider
class?MyProvider(BaseProvider):
????def?foo(self):
????????return?'bar'
faker.add_provider(MyProvider)
print(f'foo:?{faker.foo()}')
##?輸出結(jié)果
foo:?bar
最方便的是我們可以直接在命令行調(diào)用 faker,這對(duì)于某些場(chǎng)景簡(jiǎn)直不要太方便,比如我們就需要一條用戶信息的 JSON 數(shù)據(jù),那么就不需要再去寫一個(gè) Python 腳本了,直接在命令行調(diào)用 faker 命令即可生成假數(shù)據(jù)。
$?faker?address
香港特別行政區(qū)六安市海港哈爾濱街z座?561730
$?faker?-r=3?address
湖南省??谑星迤滞踅謍座?140394
海南省銀川市孝南武漢街q座?623233
青海省建華市蕭山李街w座?207439
$?faker?-r=3?profile?name,address,birthdate
{'name':?'邵麗',?'address':?'四川省想市上街吳街c座?399962',?'birthdate':?datetime.date(1979,?8,?28)};
{'name':?'張秀華',?'address':?'江西省亮市徐匯程街p座?527720',?'birthdate':?datetime.date(1907,?6,?27)};
{'name':?'王瑩',?'address':?'江西省博市房山太原路N座?615506',?'birthdate':?datetime.date(1968,?2,?7)};
總結(jié)
今天我們介紹了兩款優(yōu)秀的假數(shù)據(jù)生成庫(kù),對(duì)于大部分場(chǎng)景都是可以滿足的了,希望小伙伴們能有所收獲。
