テストにElasticsearchを導入しました
はじめまして、こんにちは!SPACEMARKETでバックエンドエンジニアをしております小見です。
今回は以前にElasticsearchのテストコードを導入したのでその内容を記事にさせていただければと思います。
ローカル環境構築からCircleCIの導入までザックリではありますが記載いたしますので、導入の手助けになれば幸いです。
※筆者まだまだひよっこエンジニアのため、
「おいおい、そんなこと当たり前に知ってるだろ」みたいに思ってしまう記述が有ると思いますがご容赦下さい。
なぜテストにElasticsearchを導入したのか
弊社では、検索機能にElasticsearchを利用しているのですが、
今までElasticsearchにリクエストするJSONを確認するテストは書いていたのですが、
Elasticsearchがリクエストに対して正常にレスポンスを返してくれるのかテストをかけていませんでした。
RDBで例えますとSQLの文字列は確認しているのに
SQLの結果、正しい検索結果かどうか確認を行っていない状態でした。
今後、様々な検索機能をElasticsearchで実装されると思われますので、
この部分のテスト化を行いたかったのがモチベーションとなります。
では、詳細な導入に進みます。
ローカル環境(Mac)にElasticsearchをインストールする
以下の記事を参考にさせて頂きました。
インストールの実施
$ brew update
$ brew install elasticsearch
$ brew info elasticsearch
elasticsearch: stable x.xx.x
.....以下省略...
brew info elasticsearchの結果バージョンが表示されれば無事インストールされております。
Elasticsearch起動
# 通常起動
$ elasticsearch
# サービスとして起動(おすすめ)
$ brew services start elasticsearch
普段Elasticsearchの開発を行うのであればサービスとして起動設定しておくとMac起動時に自動的に立ち上がりますのでオススメです。
Elasticsearch起動の確認
$ curl localhost:9200
{
"name" : "MacBook-Pro.local",
"cluster_name" : "elasticsearch_brew",
"cluster_uuid" : "xxxxxxxxxxxxxxxxx",
"version" : {
"number" : "xxxxxxxxxxxx",
"build_flavor" : "oss",
"build_type" : "tar",
"build_hash" : "unknown",
"build_date" : "xxxxxxxxxxxxxxx",
"build_snapshot" : true,
"lucene_version" : "xxxxx",
"minimum_wire_compatibility_version" : "xxxxxx",
"minimum_index_compatibility_version" : "xxxxxxxx"
},
"tagline" : "You Know, for Search"
}
Elasticsearchってmysql clientの様にCLIであれこれ出来るツールがなくってElasticsearchと言うAPIサーバーをcurlで叩いて使うイメージなんですよね。
(もしCLIツールがあったらお教え下さい。)
GUIとしては、kibana が存在するのですが、今回は割愛させて頂きます。
基本コマンド
Elasticsearchをcurlで操作するときの1例を記載します。
Elasticsearch導入したけど使い方がわからなさすぎて、
Elasticsearchに対して拒否反応を起こす人向け(筆者)に
最低限のデータ投入だったりデータの全件取得だったりを記載します。
これで少しElasticsearchと仲良くなる一歩が踏み出せた気がします。
index一覧取得
curl 'http://localhost:9200/_cat/indices?v'
mysqlで言うところのshow tables;です。
そもそもindexとは?と言うところは
以下記事がイメージ付きやすかったです。
RDBと比較した時にテーブルの位置づけをイメージすると
良いと思われます。
index作成
curl -XDELETE localhost:9200/users?pretty=true
上記コマンドでusersと言う名前のindexが作成されます
データ作成
curl -XPOST -H 'Content-Type: application/json' -d '{"name":"seiji", "age":"26"}' http://localhost:9200/users/_doc/1
上記コマンドでusersに{"name":"seiji", "age":"26"}にデータが投入されます。
URLの最後にある1はIDを指定しており、未指定だとID自動採番で投入されます。
また同じIDに対して上記コマンドを実行するとデータ上書きが行われます。
データの確認
curl -s http://localhost:9200/users/_search | jq .
{
"took": 13,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "users",
"_type": "_doc",
"_id": "1",
"_score": 1,
"_source": {
"name": "seiji",
"age": "26"
}
}
]
}
}
上記コマンドでusersに入っているデータが全て確認可能です。
hits内に入っているデータが投入したデータになります。
※jqコマンド未設定の場合は以下コマンドでインストールをお願いします。
brew install jq
テストコードの追加
実際のテストコードは言語ごとに異なるので今回は省略させていただきますが、テストの流れと詰まった所を記載させて頂きます。
基本的にはRDBテストと同じ流れで、以下の流れを実施いたします。
1.データをElasticsearchに挿入
2.テストの実行
3.データをElasticsearchから削除
これでテストが実施できるようになるのですが、1点詰まった部分が有りました。
1.データ挿入から2.テストの実行までの間があまりにも短いと
Elasticsearchからデータ取得が成功しないことが多発しました。
解決策としては、単純にSleepとかで一時的に処理を止めてからテストを実行することでこの問題は解消されました。
調べてみたのですが詳細原因はわからない状態のままです。
勝手な予想ですが、データ挿入後にElasticsearch側でデータをいい感じに作り変えるのに少し時間が必要なのかな?と思っております。
CircleCIの設定
弊社ではCIとしてCircleCIを利用しておりますのでCI環境の準備です。
と言いましても、やることは殆ど無く
dockerに以下を設定するだけでElasticsearchが立ち上がり
http://localhost:9200で接続が可能になります。
executors:
default:
docker:
- image: elasticsearch:X.X.X
environment:
discovery.type: single-node
elasticsearch:X.X.XのX.X.X部分は利用しているバージョンを指定して下さい
discovery.type: single-nodeは何なの?と思われるかも知れませんが、
正直私も理解が及んでいない部分です。
開発モードと本番モードの差だと認識しています。
本番のElasticsearchはクラスターを組んでされるようですが
開発だとクラスターの必要がないため単一ノードで動作させるための設定という認識でいます。(間違っていたらすみません。)
詳しくは以下をご覧ください。
まとめ
最後まで読んで頂きありがとうございます。
数ヶ月前までElasticsearchのEも知らないようなエンジニアでしたが、一歩Elasticsearchの世界に足を踏み入れられた気がします。
テスト導入関係なしにローカル実行などの参考になれば幸いです。
最後に宣伝させて下さい。
スペースマーケットでは、エンジニアを募集中です。
スペースシェアが当たり前になる世界観を目指して日々開発を進めています。プロダクトにご興味があれば是非、下記リンクよりご応募お待ちしております。
最近、お仕事や作業に集中できるスペースをワークルームと言うカテゴリで検索出来るようになりました。
出先で少し作業したい場合などに便利なので機会あれば見てみて下さい。
この記事が気に入ったらサポートをしてみませんか?