概要
マスターデータの変更によってシステムの挙動は変わるため, 自動テストが難しくなります.
本記事はそれをどう克服しているかお話しします.
地点検索システムの品質保証
地点検索技術の開発を担当している ymoch です.
本稿では地点検索のシステムと品質保証について取り上げます.
(地点検索それ自身については アドベントカレンダー 1 日目 で論じていますので割愛します)
ナビタイムの地点検索システムは, 全文検索システム (主に Solr) + API サーバで構成されています.
地点検索の品質を保証するために, これらを結合した状態で自動テストを実施しています.
具体的には, 以下のようなシナリオを実現できるか確認するため,
API サーバにリクエストを実行し, その結果が期待通りかどうか確認します.
- キーワード「東京」で検索すると, 東京駅がヒットする.
- ナビタイムジャパン周辺のコンビニを検索すると, ファミリーマート北青山三丁目店がヒットする.
マスターデータは自動テストを難しくする
地点検索システムは, 地点データが投入されて始めて動作します.
実際にテストを運用してみると, 投入されるデータによってシステムの挙動が日々変わることに気づきます.
このため, 自動テストを行うためのテスト項目の選定や期待値の記述が難しくなります.
- 地点の開設・閉鎖によって, ヒットする地点が変わる
- 地点の人気度が変動し, 上位にヒットする地点が変わる
- データ提供者の都合で, 地点の ID や名称が変わる
たとえば, キーワード「東京」で検索した結果が, 東京ディズニーランドに変わるかもしれません.
また, 2017 年 10 月にナビタイムジャパンのすぐ近くにセブンイレブンがオープンし,
周辺のコンビニ最上位が入れ替わってもおかしくない状況にあります.
こういったデータの変更に由来する挙動のゆらぎに対処しないまま自動テストを運用すると,
日々失敗するテストの調査をすることになります. これでは自動化の恩恵を受けることができません.
実装の確認だけが目的であれば mock や sandbox を用いることでコスト削減を狙うことができますが,
本物のデータやバックエンドを用いたときに初めて問題が起きることもあります.
ある程度は受け入れて, システムレベルでテストすることが求められます.
曖昧さを受け入れる
マスターデータを利用してテストするケースでは,
曖昧さを受け入れつつ, 自動テストを運用する仕組みを構築することが重要です.
例えば, 以下のようなテストを記述して運用できれば,
品質を保証しつつも簡単にはマスターデータに左右されなくなります.
- 「東京」で検索すると, 名称に「東京」が含まれる地点がヒットする.
- ナビタイムジャパン周辺のコンビニを検索すると, 上位 3 件にファミリーマート北青山三丁目店が含まれる.
単にテストプログラムを書くこと自体は難しくありませんが,
テストケースが増えるとスケールしなくなりますので, フレームワークを決めておくことにしました.
Postman なども候補にあがりますが, 最近は Preacher を使い始めています.
少々複雑なテストでも, プログラムを書かずに jq と YAML だけで完結できる点が魅力のツールです.
label: 地点検索システムのテスト
default:
request:
path: /spot
response:
status_code: 200
cases:
- label: キーワードに合う地点が検索できる
request:
params:
word: 東京
response:
body:
- describe: .items[0].name.ja
should:
- contain_string: 東京
- label: ある場所の周囲にある地点を検索できる
request:
params:
word: コンビニ
center: '[139.714896,35.667395]' # (株)ナビタイムジャパン
considers-distance: true
limit: 3
response:
body:
- describe:
jq: .items[].name.ja
multiple: true
should:
- have_item:
all_of:
- contain_string: ファミリーマート
- contain_string: 北青山三丁目
展望
ナビタイムジャパンでは, データ作成にも専門性が求められることから, アプリケーションの開発チームとマスターデータの開発チームが異なることがよくあります. サービスの品質を向上するための組織構成ですが, 結合して品質を保証することも一つの挑戦になります.
今後も本物のデータやバックエンドを用いた検証について研究し, 安心してサービスをリリースできる環境を作っていきたいと考えています.