kakakakakku blog

Weekly Tech Blog: Keep on Learning!

リアルなテストデータを作ってモック化までできる Mockaroo

リアルなテストデータを簡単に作ってモック化までできるサービス「Mockaroo」を紹介する❗️データベースのテストデータを作ったり,フロントエンドを実装するときに必要になるバックエンド API をモック化できる.テストデータに testhoge という文字列を使ってしまうと本番環境相当の確認がしにくく,できる限りリアルなテストデータを作りたい場面は多くあると思う💡

www.mockaroo.com

Mockaroo の特徴としては,サポートしてるタイプがなんと現時点で「13 カテゴリ(169 種類)」もある.以下にカテゴリごとにタイプ数をまとめる.What's new を見ると,定期的にタイプは増えている.

  • Advanced(10 種類)
  • Basic(29 種類)
  • Car(1 種類)
  • Commerce(13 種類)
  • Construction(6 種類)
  • Crypto(7 種類)
  • Health(17 種類)
  • IT(21 種類)
  • Location(14 種類)
  • Nature(5 種類)
  • Personal(30 種類)
  • Products(6 種類)
  • Travel(10 種類)

さらに Mockaroo では「11 種類」のフォーマット(形式)でテストデータをダウンロードできる.以下にまとめる.注意点としては,データ件数は「最大 1000 件」となるところ.

  • CSV
  • JSON
  • Tab-Delimited
  • SQL
  • Cassandra CQL
  • Firebase
  • InfluxDB
  • Custom
  • Excel
  • XML
  • DBUnit XML

お試し① SQL フォーマット

以下のタイプを選んで users テーブルに使えそうなテストデータを作ってみた.

  • Row Number
  • Username
  • Email Address
  • Avatar (Size: 50x50)
  • City
  • Country
  • Datetime (unix timestamp)

以下の条件で「SQL フォーマット」でダウンロードした.

  • Rows: 1000
  • Format: SQL
  • Table Name: users
insert into users (id, username, email, avatar, country, created_at) values (1, 'mchedgey0', 'tmonkeman0@phoca.cz', 'https://robohash.org/dictaautmollitia.png?size=50x50&set=set1', 'Bangladesh', '1650159167000');
insert into users (id, username, email, avatar, country, created_at) values (2, 'spigram1', 'sgulleford1@live.com', 'https://robohash.org/utillosaepe.png?size=50x50&set=set1', 'Bangladesh', '1638834568000');
insert into users (id, username, email, avatar, country, created_at) values (3, 'bgranville2', 'hlarroway2@ezinearticles.com', 'https://robohash.org/nihiloccaecatidoloribus.png?size=50x50&set=set1', 'Palestinian Territory', '1620444328000');
insert into users (id, username, email, avatar, country, created_at) values (4, 'dblezard3', 'emcallaster3@shinystat.com', 'https://robohash.org/quiquiasunt.png?size=50x50&set=set1', 'Germany', '1598947981000');
insert into users (id, username, email, avatar, country, created_at) values (5, 'ehebbs4', 'lmaxworthy4@jalbum.net', 'https://robohash.org/rerumesteum.png?size=50x50&set=set1', 'United States', '1619682314000');

そして SQL を MySQL にロードして,クエリを実行すると,期待通りにデータを取得できた.便利❗️

mysql> SELECT COUNT(*) FROM users;
+----------+
| COUNT(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.01 sec)

mysql> SELECT * FROM users LIMIT 5;
+------+-------------+------------------------------+----------------------------------------------------------------------+-----------------------+---------------+
| id   | username    | email                        | avatar                                                               | country               | created_at    |
+------+-------------+------------------------------+----------------------------------------------------------------------+-----------------------+---------------+
|    1 | mchedgey0   | tmonkeman0@phoca.cz          | https://robohash.org/dictaautmollitia.png?size=50x50&set=set1        | Bangladesh            | 1650159167000 |
|    2 | spigram1    | sgulleford1@live.com         | https://robohash.org/utillosaepe.png?size=50x50&set=set1             | Bangladesh            | 1638834568000 |
|    3 | bgranville2 | hlarroway2@ezinearticles.com | https://robohash.org/nihiloccaecatidoloribus.png?size=50x50&set=set1 | Palestinian Territory | 1620444328000 |
|    4 | dblezard3   | emcallaster3@shinystat.com   | https://robohash.org/quiquiasunt.png?size=50x50&set=set1             | Germany               | 1598947981000 |
|    5 | ehebbs4     | lmaxworthy4@jalbum.net       | https://robohash.org/rerumesteum.png?size=50x50&set=set1             | United States         | 1619682314000 |
+------+-------------+------------------------------+----------------------------------------------------------------------+-----------------------+---------------+
5 rows in set (0.00 sec)

mysql> SELECT country, COUNT(*) AS COUNT FROM users GROUP BY country HAVING COUNT > 50 ORDER BY COUNT DESC;
+-------------+-------+
| country     | COUNT |
+-------------+-------+
| China       |   203 |
| Indonesia   |   105 |
| Philippines |    51 |
| Russia      |    51 |
+-------------+-------+
4 rows in set (0.00 sec)

お試し② CSV フォーマット

今度は他のタイプ(気になったもの)を適当に選んでテストデータを作ってみた.

  • ULID
  • Color
  • Latitude
  • Longitude
  • File Name
  • Company Name
  • Credit Card Type
  • Credit Card #

以下の条件で「CSV フォーマット」でダウンロードした.

  • Rows: 1000
  • Format: CSV
  • Include: header
$ head -n 10 MOCK_DATA.csv
id,color,latitude,longitude,company_name,credit_card_type,credit_card_number
01GNHJCSXXATB5CJF9XME7KSF5,Violet,46.6473105,0.813275,Twitterworks,jcb,3529226789542666
01GNHJCSY1E70GJR7PEQ4WN1NA,Puce,-14.658228,49.6452092,Dabshots,jcb,3553539000204067
01GNHJCSY4YNVQ2G6GMHFJ6AP3,Turquoise,43.8051322,43.7759042,Livetube,jcb,3548207679524102
01GNHJCSY7G822Z6717N0MMYSR,Violet,23.0029267,105.2545888,Livetube,laser,67093426547314751
01GNHJCSYAW8P55K0X8B3EWB38,Pink,-9.2623446,-77.6929792,Eazzy,jcb,3544135599033025
01GNHJCSYDJB6BV6088EGGGCP4,Teal,45.72727,112.35563,Pixonyx,jcb,3572010371487902
01GNHJCSYGNSN0A529BHQ1FYYS,Purple,6.9782137,79.9115522,Trudoo,maestro,50203305431642795
01GNHJCSYKDXPGXENM5DDWFASG,Crimson,-7.3863388,108.1888233,Flashspan,jcb,3564637074986317
01GNHJCSYPF117F0YT2SFA0DMS,Red,29.3728871,113.1149933,Skajo,jcb,3528564263246532

そして CSV を Amazon S3 に置いて,Amazon DynamoDB にロードしてみた.

aws.amazon.com

期待通りに Amazon DynamoDB(テーブル/グローバルセカンダリインデックス)からデータを取得できた.便利❗️

$ aws ddb select mockaroo \
--no-consistent-read \
--max-items 5
Count: 1000
Items:
- color: Fuscia
  company_name: Twinte
  credit_card_number: '6706053594972617'
  credit_card_type: laser
  id: 01GNHJCWVBM133QADNWR1YP48K
  latitude: '62.107429'
  longitude: '129.517113'
- color: Green
  company_name: Skimia
  credit_card_number: '3565626637296552'
  credit_card_type: jcb
  id: 01GNHJCSYZYZPRE1AJVWVHDR56
  latitude: '36.3573462'
  longitude: '25.4459308'
- color: Indigo
  company_name: Minyx
  credit_card_number: '3542499593981213'
  credit_card_type: jcb
  id: 01GNHJCWN9RZ3DFFDDCAWBEK4Y
  latitude: '25.200027'
  longitude: '119.482942'
- color: Fuscia
  company_name: Yombu
  credit_card_number: '374283946958998'
  credit_card_type: americanexpress
  id: 01GNHJCV5QKDH1QMNP9SGHQ7MB
  latitude: '44.5241667'
  longitude: '129.5688889'
- color: Aquamarine
  company_name: Devbug
  credit_card_number: '675936707426408066'
  credit_card_type: maestro
  id: 01GNHJCVBQQYTP4YHRM27N1XQH
  latitude: '32.790614'
  longitude: '35.326882'
NextToken: eyJFeGNsdXNpdmVTdGFydEtleSI6IG51bGwsICJib3RvX3RydW5jYXRlX2Ftb3VudCI6IDV9
ScannedCount: 1000

$ aws ddb select mockaroo \
--index-name credit_card_type_gsi \
--key-condition 'credit_card_type = "visa"' \
--no-consistent-read \
--max-items 5
Count: 22
Items:
- color: Yellow
  company_name: Skajo
  credit_card_number: '4017959596578'
  credit_card_type: visa
  id: 01GNHJCWSWARJ3JW85VNKA8N37
  latitude: '39.930136'
  longitude: '119.576091'
- color: Red
  company_name: Fivechat
  credit_card_number: '4041590127551'
  credit_card_type: visa
  id: 01GNHJCTMH0V8CYAFKYS9JSKQ3
  latitude: '-7.0386444'
  longitude: '107.9692467'
- color: Khaki
  company_name: Mymm
  credit_card_number: '4041597904940630'
  credit_card_type: visa
  id: 01GNHJCWTV7NG6EMYG6EDPK57B
  latitude: '29.709214'
  longitude: '107.606105'
- color: Green
  company_name: Kazu
  credit_card_number: '4017952066698478'
  credit_card_type: visa
  id: 01GNHJCTT2SZGY195EN2S52JTG
  latitude: '32.187849'
  longitude: '119.425836'
- color: Pink
  company_name: Leexo
  credit_card_number: '4260700145435501'
  credit_card_type: visa
  id: 01GNHJCX9DSZYM826T0JBAQRY7
  latitude: '-9.5541709'
  longitude: '119.0285355'
NextToken: eyJFeGNsdXNpdmVTdGFydEtleSI6IG51bGwsICJib3RvX3RydW5jYXRlX2Ftb3VudCI6IDV9
ScannedCount: 22

その他

Mockaroo には他にも機能があって,気になった機能を紹介する❗️

blank

フィールドごとにブランク率 (%) を指定できる.意図的に「欠損値のあるテストデータ」を作れたりする.

Formula

Mockaroo Formula Syntax を使うと,データを変換できる.例えば,数値計算をしたり,大文字や小文字に変換したり,Base64 エンコードもできる.また if/elsif/else を使って条件付きで変換もできる.

this + 1
upper(this)
lower(this)
base64(this)

Mockaroo APIs

Mockaroo APIs を使うと,Mockaroo の設定を API で操作できる.操作するためには API Key を取得しておく必要がある.

  • GET /api/types
  • POST /api/datasets/:name
  • DELETE /api/datasets/:name
  • POST /api/generate(.format)

API 仕様に関しては以下に詳しく載っている.

Mockaroo Mock API

Mockaroo Mock API を使うと,Mockaroo にホスティングされたモック API からテストデータを取得できる.フロントエンドを実装するときに必要になるバックエンド API をモック化できたりする❗️手順としては,作った「スキーマ」を登録して,それに対応した Mock API を簡単に作れる.それに対応した Mock API を作る.

以下の例では,users スキーマからサンプルデータを5件取得している.これは便利〜👏

$ curl -s -H 'X-API-Key: xxxxxxxx' https://my.api.mockaroo.com/users.json | jq .
[
  {
    "id": 1,
    "username": "rcranfield0",
    "email": "tdavidovsky0@printfriendly.com",
    "avatar": "https://robohash.org/utetnon.png?size=50x50&set=set1",
    "country": "Somalia",
    "created_at": "1602125107000"
  },
  {
    "id": 2,
    "username": "hjaggs1",
    "email": "amilington1@alibaba.com",
    "avatar": "https://robohash.org/nihiladipiscireiciendis.png?size=50x50&set=set1",
    "country": "Portugal",
    "created_at": "1584420589000"
  },
  {
    "id": 3,
    "username": "cscimoni2",
    "email": "xpilley2@java.com",
    "avatar": "https://robohash.org/errortemporibusdolorum.png?size=50x50&set=set1",
    "country": "Greece",
    "created_at": "1648988379000"
  },
  {
    "id": 4,
    "username": "kelletson3",
    "email": "nzecchii3@mlb.com",
    "avatar": "https://robohash.org/eligendietid.png?size=50x50&set=set1",
    "country": "Russia",
    "created_at": "1638996409000"
  },
  {
    "id": 5,
    "username": "bambage4",
    "email": "jkendal4@cisco.com",
    "avatar": "https://robohash.org/similiqueofficiisquisquam.png?size=50x50&set=set1",
    "country": "Russia",
    "created_at": "1630924325000"
  }
]

まとめ

仕事でインストラクター(技術講師)をしているので,デモやプロトタイプを実装する機会が多くある.そのときにできる限りリアルなテストデータを使いたく,普段は Faker を使って,テストデータを流し込んでいる.Faker 以外に方法を探していたら Mockaroo を発見して,試してみたら良くて記事にまとめておくことにした❗️ Mockaroo は覚えておこう〜

www.mockaroo.com