もた日記

くだらないことを真面目にやる

Pythonメモ : mimesisでテストデータを生成する

mimesis


github.com

mimesisというというPythonライブラリを使用するとテストデータを簡単に生成することができるので試してみる。

f:id:wonder-wall:20170823200211p:plain

特徴としては、

  • fakerなどの他のライブラリに比べて高速
  • 様々なデータを生成可能
  • Python標準ライブラリ以外を必要としないのでシンプル

とのこと。
ここfakerと速度を比較するコードがあったので試したところ確かに高速だった(コードのfrom elizabethfrom mimesisに変更。名前が変わったのだろうか)。

$ python comp.py
[0.87593889s] generate_elizabeth(250000) -> 'Generated 250000'
[130.84236121s] generate_faker(250000) -> 'Generated 250000'


インストール


pipでインストールできるので下記コマンドを実行。

$ pip install mimesis


使い方


基本的な使い方は以下の通り。

>>> import mimesis
>>> person = mimesis.Personal(locale='en')

>>> person.full_name(gender='male')
'Linwood Ellis'

>>> person.occupation()
'Project Leader'

ロケールを指定する場合は以下のようにする。利用可能なロケール一覧はここの詳細に書いてある。もちろん日本語も使用可能。

>>> from mimesis import Personal

>>> de = Personal('de')
>>> ja = Personal('ja')

>>> de.full_name()
'Jacqueline Bauer'

>>> ja.full_name()
'かおり 遠藤'

Genericを使用すれば全てのプロバイダ(データ種別)にアクセス可能。

>>> import mimesis
>>> g = mimesis.Generic('ja')

>>> g.datetime.month()
'6月'

>>> g.food.fruit()
'イナゴマメ'


作成可能なデータ種別


作成可能なデータ種別は下記表を参照。

No Provider Description
1 Address Address data (street name, street suffix etc.)
2 Business Business data (company, company_type, copyright etc.)
3 Code Codes (ISBN, EAN, IMEI etc.).
4 ClothingSizes Clothing sizes (international sizes, european etc.)
5 Datetime Datetime (day_of_week, month, year etc.)
6 Development Data for developers (version, programming language etc.)
7 File File data (extension etc.)
8 Food Information on food (vegetables, fruits, measurements etc.)
9 Games Games data (game, score, pegi_rating etc.)
10 Personal Personal data (name, surname, age, email etc.)
11 Text Text data (sentence, title etc.)
12 Transport Dummy data about transport (truck model, car etc.)
13 Science Scientific data (scientist, math_formula etc.)
14 Structured Structured data (html, css etc.)
15 Internet Internet data (facebook, twitter etc.)
16 Hardware The data about the hardware (resolution, cpu, graphics etc.)
17 Numbers Numerical data (floats, primes, digit etc.)
18 Path Provides methods and property for generate paths.
19 UnitSytem Provides names of unit systems in international formal
20 Generic All at once
21 Cryptographic Cryptographic data

実際にどのようなテストデータがあるかは下記リンクで確認できる。
共通:
mimesis/mimesis/data/int at master · lk-geimfari/mimesis · GitHub
日本語:
mimesis/mimesis/data/ja at master · lk-geimfari/mimesis · GitHub

JSONスキーマを指定して出力


JSONスキーマを指定して出力することも可能。

>>> from mimesis.schema import Schema
>>> schema = Schema('ja')

>>> schema.load(schema={
...     "id": "cryptographic.uuid",
...     "name": "text.word",
...     "version": "development.version",
...     "owner": {
...         "email": "personal.email",
...         "token": "cryptographic.token",
...         "creator": "personal.full_name"
...     }
... }).create(iterations=2)
[{'owner': {'email': 'kandra-687@outlook.com', 'token': '9ebc404a3a4465b69ff6b30a6c31b8b3cffc38f37f6c40f0e19555034575e126', 'creator': 'ひろみ 平井'}, 'name': '追い討 ちを掛ける', 'version': '8.11.5', 'id': 'f6b76a45-f7a8-c664-bae6-6a575c04bc58'}, {'owner': {'email': 'bernardina1857@yandex.com', 'token': '3193d5d5f74be19181f9b975aa9ee679b9785d778f6407a7f3245df37efe6d2a', 'creator': 'みどり 下地'}, 'name': '精いっぱい', 'version': '4.10.1', 'id': '95f71948-9ab1-f3c3-5a39-2cc718b1b19b'}]

>>> # あるいはschema.jsonファイルから読み込み
>>> schema.load(path='schema.json').create(iterations=2)
[{'owner': {'creator': 'ももこ 猪股', 'token': '06c4409d636866c0c85024812c80ac6b133a56dc4b9c43a2991a4daa86081bbd', 'email': 'mardell-1550@live.com'}, 'name': '啄ばむ', 'version': '2.9.1', 'id': '692d0578-293f-e0df-e39a-63deb8d76fdb'}, {'owner': {'creator': '麻乃 末吉', 'token': '296c0dd9d6c71ade5419705bf085d0a3d25bed5dd8419734f778bd987d7af23e', 'email': 'madalyn_1219@outlook.com'}, 'name': 'のうみそをしぼる', 'version': '1.7.3', 'id': 'a6019f9d-cf9c-7434-8de1-4d92e5fcc379'}]

その他、READMEにはWebアプリケーションフレームワークFlaskで使用する例が書いてある。