リアルなテストデータを簡単に作ってモック化までできるサービス「Mockaroo」を紹介する❗️データベースのテストデータを作ったり,フロントエンドを実装するときに必要になるバックエンド API をモック化できる.テストデータに test
や hoge
という文字列を使ってしまうと本番環境相当の確認がしにくく,できる限りリアルなテストデータを作りたい場面は多くあると思う💡
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 にロードしてみた.
期待通りに 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 は覚えておこう〜